我正在尝试复制.txt文件中的行,并将它们写入一个新的.txt文件中,并进行微小的更改。
例如,如果文件显示为0 is less than 1
,我想将其复制到新文件中,但请说ZERO is less than ONE
。我已经能够创建一个新文件,但没有任何内容写入其中。
def numbers(fileName):
file = open(fileName, "r")
newFile = 'converted.txt'
converted = open(newFile, "w")
for line in file:
if "0" in line:
line.replace("0", "ZERO")
elif "1" in line:
line.replace("1", "ONE")
else:
return
return
答案 0 :(得分:1)
您的代码存在两个大问题:
首先,line.replace
不会对line
本身做任何事情。正如文档所说,它将:
返回字符串的副本,其中所有出现的substring old都替换为new ...
但是你没有存储新的字符串,或用它做任何其他事情。
其次,你永远不会向converted
写任何东西。
一次修复两个:
for line in file:
if '0' in line:
converted.write(line.replace('0', 'ZERO'))
elif '1' in line:
converted.write(line.replace('1', 'ZERO'))
else:
return
但是,你也有一些小问题。您第一次找到没有return
或0
的行时1
。如果一行包含0
和1
,则只会替换0
。您永远不会close
该文件,这意味着该文件可能永远不会刷新到磁盘,并且可能最终为空或不完整。所以,让我们解决所有这些问题:
with open(fileName, "r") as file, open('converted.txt', 'w') as converted:
for line in file:
line = line.replace("0", "ZERO")
line = line.replace("1", "ONE")
converted.write(line)
replace
所有0都是绝对安全的,即使没有 - 它只是不会做任何事情。 (如果你试图通过跳过昂贵的工作来优化事情,如果没有工作要做,"0" in line
和replace
一样长,当没有任何事可做时,你实际上已经很难过了事情......这是在你的编程生涯早期学到的一个很好的教训。)这意味着你根本不需要if
语句,你不需要修改你链接它们的方式,并且您对return
中的else
没有问题。
with
语句会在您离开时自动为close
和file
调用converted
(即使您提前离开,因为,例如,意外的例外)。
答案 1 :(得分:0)
with
自动清理它们。return
或0
,您确定要1
吗?-
def numbers(filename):
with open(filename, 'rU') as file_in:
with open('converted.txt', 'w') as file_out:
for line in file_in:
if '0' in line:
line = line.replace('0', 'ZERO')
elif '1' in line:
line = line.replace('1', 'ONE')
file_out.write(line)
答案 2 :(得分:0)
TkTech和abarnet在如何打开文件和保存返回值方面都有一些很好的建议。自动清理很好。
虽然有一个合乎逻辑的问题。在你给出的例句中,“0小于1”,单行中同时包含“0”和“1”。如果您要通过任一函数发送该行,则会将该行修改为“ZERO小于1”而不是您的预期“ZERO小于1”。这样做的原因是因为第一个if语句会捕获“0”,但是使用elif或者甚至会向程序表明“你已经找到了第一个条件,不用费心去检查其余的条件”。既然你想要捕获任何1,无论是否存在任何0,你都不应该使用任何其他语句。
以下是我的写作方式:
def convert(file):
in_file = open(file, "r")
out_file = open("/home/user/temp/converted.txt", "w+")
# Read up on what r and w+ mean; docs.python.org
for line in in_file:
# Catch 0 in line
if "0" in line:
line = line.replace("0", "ZERO")
# Catch 1 in line
if "1" in line:
line = line.replace("1", "ONE")
# Write line to file
out_file.write(line)
#end for
# Close open files; this is common practice in C
# Not needed in Python when using "with open(file, 'r') as filename:"
in_file.close()
# Force it to write out anything left in buffer; not usually needed as Python usually does this when calling close()
out_file.flush()
out_file.close()
除了根据预期输入文件的格式可以进行的改进之外,我的代码还有许多改进。
然而,它确实在它的当前状态下工作:
0 is less than 1
1 is greater than 0
0 1
1 0
给我这个:
ZERO is less than ONE
ONE is greater than ZERO
ZERO ONE
ONE ZERO
比这更复杂的文件可能会给您带来意想不到的结果,例如:
0 is less than 1 but larger than -1 ==> ZERO is less than ONE but larger than -ONE
0 is larger than -1 ==> ZERO is larger than -ONE
2 is larger than 0 ==> 2 is larger than ZERO
0 1 2 3 4 5 6 7 8 9 10 ==> ZERO ONE 2 3 4 5 6 7 8 9 ZEROONE
0000001 ==> ZEROZEROZEROZEROZEROZEROONE
1001101 ==> ONEZEROZEROONEONEZEROONE