Python 3.x 使用Python替换\r\r\n“;加上\r\n“;在二进制文件中
我对Python非常陌生,只是通过爬行来完成一项任务,希望能得到一些帮助(Python3.1) 我有一个用DictWriter编写的CSV文件,方言是“excel”。创建文件后,我注意到文件中有多余的行,仔细检查,这是因为我在每行末尾都有“\r\n”而不是“\r\n” 我可以用两种方法之一解决这个问题:Python 3.x 使用Python替换\r\r\n“;加上\r\n“;在二进制文件中,python-3.x,Python 3.x,我对Python非常陌生,只是通过爬行来完成一项任务,希望能得到一些帮助(Python3.1) 我有一个用DictWriter编写的CSV文件,方言是“excel”。创建文件后,我注意到文件中有多余的行,仔细检查,这是因为我在每行末尾都有“\r\n”而不是“\r\n” 我可以用两种方法之一解决这个问题: 以二进制模式而不是文本模式打开文件。问题是我一辈子都无法弄清楚如何让writerow()在二进制文件上工作——我遇到了大量异常 第二个(更简单的)解决方案是将所有“\r\r\n”替换为“\r\n
#code before this writes to the final in text mode
myfile.close()
myfile = open(outputFile, "wb")
for line in fileinput.FileInput(outputFile, inplace=1):
line = line.replace("\r\r\n", "\r\n")
print (line)
myfile.close()
将感谢任何人提供的任何帮助!更改文件的安全方法(附加除外,附加可以安全地完成)就是通过修改将其复制到新文件中,删除旧文件,像重命名旧文件一样重命名新文件。这是避免灾难性错误和数据丢失的一种可靠方法。根据平台的不同,“删除旧文件,重命名新文件”的步骤可能是原子的,但在Windows中这很难,并不是那么重要 因此,我只需一大口地这样做,除非文件非常大(GB以上): 代码的问题在于二进制模式和文本模式之间的混淆——例如,您无法从二进制模式打开的文件中正确地“读取一行” 编辑在Python 3.1中,我们需要在这里处理
字节
实例,不是字符串,因为文件是二进制文件。因此,根据,写入调用必须
f.write(data.replace(b'\r\r\n', b'\r\n'))
那些b
前缀告诉Python我们处理的是字节,而不是str
字符串。试试这个:
fileR = open(outputFile, "r")
text = fileR.read().replace("\r\r\n", "\r\n")
fileR.close()
fileW = open(outputFile, "wb")
fileW.write(text)
fileW.close()
我不太熟悉文件处理中的特殊情况。但是,既然您提到您正在处理CSV文件(可以用excel打开),我建议您浏览一下
希望这有帮助此外,您遇到的问题\r\n可能是由于您在Windows平台上,并以文本模式而不是二进制模式打开文件造成的
我遇到了这个问题,并在这里找到了答案要正确写入CSV文件,而不是事后更正,请参见此问题:
我刚刚尝试了这个方法,但出现了这样的错误:“TypeError:需要一个具有缓冲区接口的对象”在这行:“f.write(data.replace('\r\n','\r\n'))”@TMC,你应该提到你正在使用Python3;)啊,Python3.1——我刚才在你的问题正文中注意到了它(它有一个特定的标签,因为几乎所有人都在使用的2.5/2.6版本和更新的3.1版本之间的正确答案经常有很大的差异)。解决方案是:--让我编辑答案以澄清。@gnibbler,他做了(在第一段末尾的括号中),只是不够明显,我没有注意到(理想情况下是作为标记;-)。我现在编辑了答案,以显示Python 3所需的微小更改。这也不起作用。当第二次以二进制文件(“b”标志)打开文件时,我在尝试写出新文本时出现此错误:“TypeError:必须是字节或缓冲区,而不是str”。我在没有二进制标志的情况下尝试了它(以文本形式打开)但我也遇到了同样的问题。每一行都是用\r\r\n而不是\r\n写出来的。有用的库很方便,但现在对我来说太麻烦了。我已经正确地写出了CSV文件,并且可以轻松地导入Excel。旁注:发生这种情况的原因是,您没有为.CSV
文件调用打开使用newline=''
(打开要与csv
模块一起使用的文件的唯一正确方法)并且您在Windows上,使用类似Windows的方言csv
csv。writer
明确地编写了\r\n
(因为所讨论的方言使用了\r\n
作为换行符)并且,由于未能使用换行符=''
禁用打开中的行结束转换,\n
被io.TextIOWrapper
转换为\r\n
,使其位于磁盘上。
fileR = open(outputFile, "r")
text = fileR.read().replace("\r\r\n", "\r\n")
fileR.close()
fileW = open(outputFile, "wb")
fileW.write(text)
fileW.close()