from unidecode import *
reader = open("a.txt",'w')
def unite():
for line in reader:
line = unidecode(line)
print (line)
unite()
现在,我收到一条错误消息,说在写入模式下不允许循环。有没有其他方法,我可以像这样修改每一行,以便可以使用 unidecode 进行转换?
from unidecode import *
reader = open("a.txt",'w')
def unite():
for line in reader:
line = unidecode(line)
print (line)
unite()
现在,我收到一条错误消息,说在写入模式下不允许循环。有没有其他方法,我可以像这样修改每一行,以便可以使用 unidecode 进行转换?
你可以把这一切都记在心里。
from unidecode import *
reader = open("a.txt",'w')
lines = reader.readlines()
def unite(lines):
for line in lines:
line = unidecode(line)
print (line)
unite()
您也可以使用临时文件。
from unidecode import *
import os
reader = open('a.txt','r')
temp = open('~a.txt', 'w')
for line in reader():
line = unidecode(line)
temp.write(line)
reader.close()
temp.close()
os.remove('a.txt')
os.rename('~a.txt', 'a.txt')
您可以在附加模式下打开它:
def unite():
with open('somefile.txt','a+') as f:
for line in f:
f.write(unidecode(line))
print line
unite()
这会将内容写入文件末尾。要从文件开头写入内容,请使用 mode r+
。
例如:
sample.txt
:
hello world
当你运行这个:
with open('sample.txt','a+') as f:
line = f.readline()
f.write('{} + again'.format(line.strip()))
该文件将具有:
hello world
hello world again
如果你运行:
with open('sample.txt','r+') as f:
line = f.readline()
f.write('{} + once more'.format(line.strip()))
该文件将具有:
hello world
hello world once more
hello world again
如果要替换文件的内容,则可以读取文件,保存行,将其关闭并以写入模式打开以将行写回。
这是一个有点肮脏的秘密,但很少有应用程序能够真正“就地”更改文件。大多数时候,看起来应用程序正在修改文件,但在后台,编辑后的文件被写入临时位置,然后移动到替换原来的位置。
如果您考虑一下,当您在文件中间插入几个字节时,无论如何您都必须从这一点重写整个文件。
由于 ascii 输出往往比 unicode 输入小,你可能可以完成这样的事情(我猜只有 unix):
#!/usr/bin/env python
import os
from unidecode import unidecode
def unidecode_file(filename):
# open for write without truncating
fd = os.open(filename, os.O_WRONLY)
pos = 0 # keep track of file length
# open for read
with open(filename) as input:
for line in input:
ascii = unidecode(line.decode('utf-8'))
pos += len(ascii)
os.write(fd, ascii)
os.ftruncate(fd, pos) # truncate output
os.close(fd) # that is all, folks
if __name__ == '__main__':
unidecode_file('somefile.txt')
这个特技是不安全的,也不是编辑文件的规范方法(如果输出大于输入,你肯定会遇到麻烦)。使用Drew建议的 tempfile 方法,但要确保文件名的唯一性(最安全的方法是为临时文件生成随机文件名)。