我是Python的新手,只是抓住它来完成任务,并感谢一些帮助(Python 3.1)。
我有一个用DictWriter编写的CSV文件,方言为“excel”。创建文件后,我注意到文件中有多行,经过仔细检查,这是因为我在每行的末尾都有“\ r \ n \ n \ n”而不是“\ r \ n”。
我可以解决以下两种方式之一:
以二进制模式而不是文本打开文件。问题在于我不能为我的生活弄清楚如何让writerow()对二进制文件起作用 - 我有很多例外。
第二个(更简单)解决方案是将所有“\ r \ n \ n \ n”替换为“\ r \ n”。
然而,在我的尝试中,我遇到了这些错误:
一个。不先关闭文件,搜索和替换只会添加更多的“\ r \ n \ n”行。 湾我已经尝试先关闭文件,以二进制模式重新打开并进行相同的搜索和替换,但我得到了错误:
WindowsError:[错误32]进程无法访问该文件,因为它正被另一个进程
使用
以下是代码:
#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()
可以提供任何人可以提供的任何帮助!
答案 0 :(得分:4)
更改文件的安全方式(附加除外,可以安全地就地完成)是将其复制并修改为新文件,删除旧文件,重命名像旧的一样新。这是避免灾难性错误和数据丢失的一种可靠方法。根据平台的不同,“删除旧的,重新命名为新”的步骤可能是原子的,但在Windows中这很难,并不是那么重要。
所以我只是这么做 - 大口一口气,除非文件可怕的巨大(gigabyte-plus):
with open(filename, 'rb') as f:
data = f.read()
with open(newfilename, 'wb') as f:
f.write(data.replace('\r\r\n', '\r\n'))
os.unlink(filename)
os.rename(newfilename, filename)
您的代码问题在二进制和文本模式之间存在混淆 - 例如,您无法从二进制模式打开的文件中正确地“读取一行”。
在Python 3.1中, 编辑我们需要在这里处理bytes
个实例,不是字符串,因为这些文件是二进制文件。因此,根据the docs,write
来电必须成为
f.write(data.replace(b'\r\r\n', b'\r\n'))
那些b
前缀告诉Python我们正在处理bytes
,而不是str
。
答案 1 :(得分:1)
此外,您使用\ r \ n \ n \ n \ n时出现的问题可能是由于您在Windows平台上以及在文本模式下打开文件而不是以二进制模式打开文件。
我遇到了这个问题,并在Python 2 CSV writer produces wrong line terminator on Windows
找到了答案答案 2 :(得分:0)
试试这个:
fileR = open(outputFile, "r")
text = fileR.read().replace("\r\r\n", "\r\n")
fileR.close()
fileW = open(outputFile, "wb")
fileW.write(text)
fileW.close()
答案 3 :(得分:0)
我对文件处理中的特殊情况并不太熟悉。但是,由于您提到您正在处理CSV文件(可以使用excel打开),我建议您查看pyExcelerator。
希望这有帮助
答案 4 :(得分:0)
要正确编写CSV文件而不是在事后更正它们,请参阅此问题: Python3: writing csv files