我对 Python 非常陌生,只是通过它爬行以完成任务,并希望得到一些帮助(Python 3.1)。
我有一个用 DictWriter 编写的 CSV 文件,其方言为“excel”。创建文件后,我注意到文件中有多余的行,仔细检查是因为每行末尾都有“\r\r\n”而不是“\r\n”。
我可以通过以下两种方法之一解决这个问题:
以二进制模式而不是文本模式打开文件。问题在于,我终其一生都无法弄清楚如何让 writerow() 对二进制文件起作用——我得到了很多异常。
第二种(更简单的)解决方案只是用“\r\n”替换所有的“\r\r\n”。
但是,在我的尝试中,我遇到了以下错误:
一种。不先关闭文件,搜索和替换只会添加更多的“\r\r\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()
Run Code Online (Sandbox Code Playgroud)
任何人都可以提供任何帮助!
更改文件的安全方法(除了附加,可以安全地就地完成)是将修改后的文件复制到新文件中,删除旧文件,像旧文件一样重命名新文件。这是避免灾难性错误和数据丢失的一种可靠方法。根据平台的不同,“删除旧的,重命名新的”步骤可能是原子性的,但这在 Windows 中很难,而且并不是那么重要。
所以我只是这样做 - 一大口,除非文件非常大(千兆字节以上):
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)
Run Code Online (Sandbox Code Playgroud)
您的代码的问题是二进制模式和文本模式之间的混淆——例如,您无法从二进制模式打开的文件中正确“读取一行”。
在 Python 3.1 中编辑我们需要在bytes这里处理实例,而不是字符串,因为文件是二进制文件。因此,根据文档,write调用必须变为
f.write(data.replace(b'\r\r\n', b'\r\n'))
Run Code Online (Sandbox Code Playgroud)
这些b前缀告诉 Python 我们正在处理的是bytes,而不是strings。
| 归档时间: |
|
| 查看次数: |
7981 次 |
| 最近记录: |