python - IO错误 : File not open for writing - Python

标签 python

我正在打开一个文件,如果满足特定条件,则打开另一个文件并将记录从第一个文件传输到第二个文件,然后从第一个文件中删除它们。下面的代码有效,但 f.truncate() 行除外,它导致了这篇文章标题中的错误。谁能告诉我需要修改什么才能使这项工作正常进行?

f = open(filename,"r")
d = f.readlines()
f.seek(0)
for i in d:
    e = i.split(',')
    if len(e) > 28:
        with open(filename2, "a") as text_file:
            text_file.write(i.encode('cp1252'))
        text_file.close
f.truncate()        
f.close()

最佳答案

您必须以 "r+" 打开第一个文件才能读写,如下所示:

f = open(filename,"r+")
for line in f:
    e = line.split(',')
    if len(e) > 28:
        with open(filename2, "a") as text_file:
            text_file.write(line.encode('cp1252'))
f.seek(0)
f.truncate()        
f.close()

我还提高了代码的效率,因为它应该遍历行而不是将它们复制到一边。一种更有效的方法是:

with open(filename,"r+") as file1, open(filename2, "a") as file2:
    for line in f:
        if line.count(',') > 27:
            file2.write(line.encode('cp1252'))
    file1.truncate(0)

这样您就不会在每次迭代时都重新打开文件,并且由于您没有使用拆分值,您可以只计算逗号 (,) 并与 27 而不是 28 进行比较。

仅删除复制的行

如果您只想删除复制的行而不清空文件,除了将整个文件复制到内存或使用tempfile 之外别无他法。 .

复制到内存的方法是这样的:

with open(filename,"r+") as file1, open(filename2, "a") as file2:
    file_lines = file1.readlines()
    file1.seek(0)
    file1.truncate()
    for line in file_lines:
        if line.count(',') > 27:
            file2.write(line.encode('cp1252'))
        else:
            file1.write(line)

如果您使用的是 Python 3.X,请确保指定编码。

关于python - IO错误 : File not open for writing - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36103469/

相关文章:

python - 如何为彩色散点图创建图例而不是颜色条?

python - Pandas 应用 key 错误

python - 谷歌云语音到文本没有为 OGG 和 MP3 文件提供输出

python - python中的稀疏文件使用

python - 无法使用 REST Framework JWT 进行身份验证

python - 使用多字节 key 对文件进行 XORing

Python 字符串作为子进程的文件参数

python - CMD 自动完成无法正常工作

python - 警告 : Incorrect Integer Value error MYSQL

python - 为什么在求解稀疏线性方程组时会出现内存错误?