所以我有一个运行的程序。这是代码的一部分:
FileName = 'Numberdata.dat'
NumberFile = open(FileName, 'r')
for Line in NumberFile:
if Line == '4':
print('1')
else:
print('9')
NumberFile.close()
一个毫无意义的事情,是的,但我只是为了增强我的理解。但是,此代码不起作用。该文件保持原样,4不会被1代替,其他所有内容都不会被9代替,它们只是保持不变。我哪里错了?
Numberdata.dat为"444666444666444888111000444"
现在是:
FileName = 'Binarydata.dat'
BinaryFile = open(FileName, 'w')
for character in BinaryFile:
if charcter == '0':
NumberFile.write('')
else:
NumberFile.write('@')
BinaryFile.close()
答案 0 :(得分:2)
因为您还需要写入文件。
with open(FileName, 'w') as f:
f.write(...)
现在你只是阅读和操纵数据,但你没有回复它们。
最后,您需要以写入模式重新打开文件并写入。
如果您正在寻找推荐信,请查看open()
documentation和Reading and Writing Files的Python Tutorial部分。
编辑:您不应该从同一个文件同时读写。您可以写入临时文件并在结束时调用shutil.move()
,或者加载并操作数据,然后重新 - 以写入模式打开原始文件并将其写回。 / p>
答案 1 :(得分:2)
首先,Line
永远不会等于4
,因为从文件中读取的每一行都包含末尾的换行符。尝试if Line.strip() == '4'.
这将从行的开头和结尾删除所有空格。
编辑:我刚刚看到你的编辑...当然,如果你的所有数字都在一行上,那么这行就永远不会等于4.你可能想要一次读取一个字符,而不是一行中的一行时间。
其次,您没有写入任何文件,因此文件自然不会被更改。在阅读文件时,您将很难更改文件(因为您必须弄清楚如何备份到您刚读取的同一个地方),因此通常的做法是从一个文件读取并写入另一个文件。
答案 2 :(得分:1)
您需要构建一个字符串并将其写入文件。
FileName = 'Numberdata.dat'
NumberFileHandle = open(FileName, 'r')
newFileString = ""
for Line in NumberFileHandle:
for char in line: # this will work for any number of lines.
if char == '4':
newFileString += "1"
elif char == '\n':
newFileString += char
else:
newFileString += "9"
NumberFileHandle.close()
NumberFileHandle = open(FileName, 'w')
NumberFileHandle.write(newFileString)
NumberFileHandle.close()
答案 3 :(得分:0)
一些事情:
r
的{{1}}标记表示open
模式。这显然不会让你写入文件。
read-only
将内容输出到屏幕。你真正想要做的是输出到文件。你有read the Python File I/O tutorial?
print()
一次循环一行文件。因此,for line in file_handle:
只有在该行由单个字符if line == '4'
组成时才会为真。
如果要循环字符串中的字符,请执行4
之类的操作。
“就地”修改文件位比你想象的要难一点。
这是因为如果你将数据插入到文件的中间,其余的数据必须随机播放以腾出空间 - 这非常慢,因为插入后的所有内容都必须重写。
理论上,单字节替换的单字节可以快速完成,但一般人们不希望逐字节替换,因此这是一项高级功能。 (参见for character in line:
。)通常的方法是写出一个全新的文件。
答案 4 :(得分:0)
您没有向数据发送任何输出,只需将1
和9
打印到stdout
,通常是终端或翻译。
如果您要写入该文件,则必须使用open
再次使用w
。
例如。
out = open(FileName, 'w')
您也可以使用
print >>out, '1'
然后你可以打电话给out.write('1')
。
如果你想覆盖并写下来,最好先读取文件。
答案 5 :(得分:0)
根据你的评论:
Numberdata只是一行数字的加载。也许这就是我出错的地方?它是“444666444666444888111000444”
我可以告诉你for
周期,迭代行而不是字符。存在逻辑错误。
此外,您必须编写该文件,正如Rik Poggi所说(只需在写入模式下将其打开)
答案 6 :(得分:0)
因为print不会写入您的文件。 你必须打开文件并阅读它,修改你获得的字符串,创建一个新字符串,再次打开文件并再次写入。
FileName = 'Numberdata.dat'
NumberFile = open(FileName, 'r')
data = NumberFile.read()
NumberFile.close()
dl = data.split('\n')
for i in range(len(dl)):
if dl[i] =='4':
dl[i] = '1'
else:
dl[i] = '9'
NumberFile = open(FileName, 'w')
NumberFile.write('\n'.join(dl))
NumberFile.close()
尝试这种方式。肯定有不同的方法,但这对我来说似乎是最“线性的”=)