我是python的新手。在其中一个任务中,我必须在特定行之前添加一个字符。例如,在我的文本文件中
名称
和
姓
是固定行,我必须根据标记
添加或删除;
hey : see
;Name:blah
;Surname:blah
这是我为此编写的代码......它是否足够有效?我们可以写得更有效吗?我们可以通过
姓名和姓氏
作为参数我的意思是关键字作为添加
的函数的参数def changefile(filepath,flag):
# flag = 1
final = ""
with open(filepath) as content:
for line in content:
if flag==1:
if line.split(":")[0]==";Name" or line.split(":")[0]==";Surname":
final += line[1:]
else:
final += line
else:
if line.split(":")[0]=="Name" or line.split(":")[0]=="Surname":
final += ";"
final += line
f = open(filepath, 'r+')
f.truncate()
f.write(final)
f.close()
changefile("abc.txt",0)
答案 0 :(得分:0)
我嘲笑了很多,并借用了马蒂诺的想法,并最终得到了这个:
def change_file(filepath, add_comment, trigger_words):
def process(line):
line_word = line.lstrip(';').split(':')[0]
if line_word in trigger_words:
if add_comment:
line = line if line.startswith(';') else ';' + line
else:
line = line.lstrip(';')
return line
with open(filepath) as f:
content = [process(line) for line in f]
with open(filepath, 'r+') as f:
f.truncate()
f.write(''.join(content))
change_file('abc.txt', add_comment=True, trigger_words=["sys", "netdev"])
主要的“好”位(我喜欢)使用列表推导[process(line) for line in f]
,因为它取消了整个final = ''; final += blah
排列。它处理每一行,这就是输出。
我已经更改了flag
所以而不是阅读“标志是0或1 ”(这是什么意思?)它现在显示为“ add_comment是True还是False “,以更清楚地表明它的作用。
在效率方面,可能会更好; (使“trigger_words”成为一组,以便测试成员资格更快,改变其规范化每一行进行测试的方式);但是如果你正在处理一个小文件,那么Python的速度就不会太大了,如果你处理的是一个巨大的文件,那么IO的限制可能比CPU有限。
在线尝试:https://repl.it/CbTo/0(它会读取并打印结果,但不会尝试保存)。
(NB。.lstrip(';')
将删除行开头的所有分号,而不只是一行。我假设只有一个分号。
从评论中进行编辑。这是一个版本,它将处理SQL Server UTF-16安装文件而不会搞砸它,但我不知道这个适用于所有文件的一般修复。请注意,这会将文件作为特定数据编码读取,并使用特定数据编码写入二进制文件。并将SQL ini格式的拆分更改为=
。并且不truncate
,因为w
模式可以做到这一点。
import codecs
def change_file(filepath, add_comment, trigger_words):
def process(line):
line_word = line.lstrip(';').split('=')[0]
if line_word in trigger_words:
if add_comment:
line = line if line.startswith(';') else ';' + line
else:
line = line.lstrip(';')
return line
with codecs.open(filepath, encoding='utf-16') as f:
content = [process(line) for line in f]
with codecs.open(filepath, 'wb', encoding='utf-16') as f:
f.write(''.join(content))
change_file('d:/t/ConfigurationFile - Copy.ini', add_comment=True, trigger_words=["ACTION", "ENU"])