【问题标题】:File I/O in PythonPython 中的文件 I/O
【发布时间】:2015-11-28 08:42:33
【问题描述】:

我正在尝试读取一个 CSV 文件,然后将读取的 CSV 写入另一个 CSV 文件。

到目前为止,这是我的代码:

import csv 
with open ("mastertable.csv") as file:
    for row in file:
    print row  
with open("table.csv", "w") as f:
   f.write(file)

我最终想读取一个 CSV 文件写入一个带有附加数据的新 CSV。

当我尝试运行它时出现此错误。

Traceback (most recent call last):
File "readlines.py", line 8, in <module>
f.write(file)
TypeError: expected a character buffer object

据我了解,似乎我必须关闭文件,但我认为自动关闭它?

我不确定为什么我可以将字符串写入文本,但我不能简单地将 CSV 写入另一个 CSV,就像通过迭代复制它一样。

【问题讨论】:

  • 你有什么问题?
  • 现在,错误似乎更清楚了:您已经关闭了file 对象,因此,当您在f.write(file) 行中再次需要它时,它已经关闭了! (再一次,你有一个缩进问题,这次print row 是错误的)
  • @Barranka:无论如何您都不能将文件对象写入另一个文件。他们想要跨进行复制,而不是文件对象本身。
  • 对于这个不具体的开放式问题,我深表歉意。

标签: python csv file-io io


【解决方案1】:

文件变量并不是真正的文件数据,而是一个用于读取数据的引用指针。当您执行以下操作时:

with open ("mastertable.csv") as file: for row in file: print row

文件指针自动关闭。 write 方法需要一个字符缓冲区或一个字符串作为输入,而不是文件指针。

如果你只是想复制数据,你可以这样做:

 data = ""
 with open ("mastertable.csv","r") as file:
     data = file.read()
 with open ("table.csv","a") as file:
     file.write(data)`

【讨论】:

    【解决方案2】:

    您似乎打算使用 Python csv 模块。以下应该是您想要实现的目标的良好起点:

    import csv 
    
    with open("mastertable.csv", "r") as file_input, open("table.csv", "wb") as file_output:
        csv_input = csv.reader(file_input)
        csv_output = csv.writer(file_output)
    
        for cols in csv_input:
            cols.append("more data")
            csv_output.writerow(cols)
    

    这将一次读取一行中的mastertable.csv 文件作为列列表。我追加了一个额外的列,然后将每一行写入table.csv

    注意,当您离开with 语句的范围时,文件会自动关闭。

    【讨论】:

    • 谢谢,这绝对是我要研究的下一步。感谢您的宝贵时间和帮助。
    【解决方案3】:

    要读取 CSV 文件并写入另一个文件,您可以执行以下操作:

    with open("table.csv", "w") as f:
        with open ("mastertable.csv") as file:
            for row in file:
               f.write(row)
    

    但只有在转录时需要编辑行时,我才会这样做。对于所描述的用例,您可以简单地使用shutil 复制它,然后打开它以附加到它。这种方法会更快,更不用说更具可读性。

    with 运算符将为您处理文件关闭,并在您离开该代码块时关闭文件(由缩进级别给出)

    【讨论】:

    • 谢谢!这就是我想要写的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    相关资源
    最近更新 更多