![](/img/trans.png)
[英]How do I get the filename of a file to open and the filename of a file to save in python
[英]What's the encoding in which the file is saved when I use open(filename) in Python or fopen(filename) in C?
运行时环境:Python 2.7,Windows 7
注意:我在谈论由PYTHON源代码生成的文件的编码(不是在谈论PYTHON源文件的编码),在PYTHON源文件DID顶部声明的编码与PYTHON源文件的编码一致得救了。
当字符串中没有非ascii字符( content = 'abc'
)时,文件( file.txt
,而不是PYTHON源文件)在fp.close()
之后以ANSI编码保存,PYTHON文件(和它)以ANSI编码格式保存)内容如下:
## Author: melo
## Email:prevision@imsrch.tk
## Date: 2012/10/12
import os
def write_file(filepath, mode, content):
try:
fp = open(filepath, mode)
try:
print 'file encoding:', fp.encoding
print 'file mode:', fp.mode
print 'file closed?', fp.closed
fp.write(content)
finally:
fp.close()
print 'file closed?', fp.closed
except IOError, e:
print e
if __name__ == '__main__':
filepath = os.path.join(os.getcwd(), 'file.txt')
content = 'abc'
write_file(filepath, 'wb', content)
但是当字符串中有一些非ascii字符( content = 'abc莹'
)时,文件( file.txt
)将在fp.close()
之后以UTF-8编码保存,尽管我在使用#encoding #encoding=gbk
填充PYTHON源文件(不是file.txt
)的顶部。 此时,PYTHON源文件的内容如下:
# -*- encoding: gbk -*-
## Author: melo
## Email:prevision@imsrch.tk
## Date: 2012/10/12
import os
def write_file(filepath, mode, content):
try:
fp = open(filepath, mode)
try:
print 'file encoding:', fp.encoding
print 'file mode:', fp.mode
print 'file closed?', fp.closed
fp.write(content)
finally:
fp.close()
print 'file closed?', fp.closed
except IOError, e:
print e
if __name__ == '__main__':
filepath = os.path.join(os.getcwd(), 'file.txt')
content = 'abc莹'
write_file(filepath, 'wb', content)
有没有证据表明它的行为如此?
文件以您保存的编码保存。源文件以您保存的编码保存。它们不必相同,只需声明它们即可。
根据您的其他问题 ,我假设您正在使用Notepad ++,当您打开file.txt
您会发现Notepad ++认为该文件是以UTF-8 without BOM
编码UTF-8 without BOM
。 这是Notepad ++的错误猜测 。 选择中文GB2312字符集,文件将正确显示。
除非给出字节顺序标记(BOM)或某些其他元数据的提示或用户告知,程序不知道文件的编码是什么。
一个正确的Python程序会做这些事情:
例:
# encoding: utf-8
import codecs
with codecs.open('file.txt','wb',encoding='utf-8-sig') as f:
f.write(u'abc莹')
您现在应该在Notepad ++中看到file.txt
被检测为编码为'UTF-8'(带有BOM)并正确显示文件。
请注意,如果将编码声明为gbk
,则可以将文件保存为“ANSI”(系统上的GBK),并且由于使用了Unicode字符串,因此它仍然可以正常工作。
实际上,您的系统可能是代码页936( cp936
)而不是GBK。 它们并不完全相同。 最好使用UTF-8或UTF-16等Unicode编码,它可以准确地表示所有Unicode字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.