【问题标题】:Python - Writing to CSV file spits all text into one cellPython - 写入 CSV 文件会将所有文本吐到一个单元格中
【发布时间】:2013-10-03 15:19:03
【问题描述】:

我是 Python 新手,我正在尝试获取一些具有以下格式数据的文本文件:

time_stamp 持续时间 word1 p1 word2 p2 ....

并将数据写入 CSV 文件。对于我写入的每一行,我还希望包含从中获取该行的文件的名称。

我的问题是我正在执行的代码似乎将所有文本写入一个单元格。当我使用 LibreOffice 打开 CSV 文件时,它会显示垃圾字符,表示它无法正确显示数据,因为超出了每个单元格的最大字符数限制。

我做错了什么?

import csv, os

path = "./TRIAL with CSV"
all_the_files = os.listdir(path)

for each_file in all_the_files:
    file = os.path.join(path, each_file)
    ifile  = open(file, "rb")
    reader = csv.reader(ifile)
    ofile  = open('CSVtrial.csv', "a")
    writer = csv.writer(ofile, delimiter='\t', quoting=csv.QUOTE_MINIMAL)

    for row in reader:
        writer.writerow([each_file,row])


ifile.close()
ofile.close()

编辑:我不认为我可以在此处附加文件,但示例输入文件将是具有以下行的 .txt 文件:

186.860 0.060 (01) 0.89221220 公顷(01) 0.04941113 啊(01) 0.04552169 oo(01) 0.01065865 o(01) 0.00219633

187.110 0.410 邦加(01) 1.00000000

187.520 0.349 纳曼(01) 0.99999601

187.872 0.598 niyan(01) 0.81980968 'yan(02) 0.16510634 iyan(02) 0.00814381 niya(01) 0.00471968 ganyan(01) 0.00139249 diyan(03) 0.00082159

有大约 50,000 个这样的 .txt 文件,我正在尝试将它们编译成单个 CSV 文件,以便更轻松地分析数据。

这是我尝试在 LibreOffice 中查看 CSV 文件时遇到的错误类型的屏幕截图 - http://i.imgur.com/jvsvxrx.png?1

现在我已经放弃了这个,我只是想在 vim 上工作。如果有人对我如何将这些 .txt 文件编译成电子表格之类的东西有任何其他建议,这样可以更容易地分析数据,我将不胜感激。

【问题讨论】:

  • 你想做什么?现在,您正在将其他文件中的内容转储到 csv 中。
  • @RickyA,是的,这正是我想要做的
  • @Alvaro,我可以在 vim 中查看文件。我没有考虑过使用不同的分隔符。有没有办法在我的代码中做到这一点?谢谢

标签: python csv python-2.7


【解决方案1】:

假设分隔符是正确的,这看起来是错误的:

for row in reader:
    writer.writerow([each_file,row])

因为这将创建一个恰好包含两列的行,其中第二个单元格将包含整个原始行,并已序列化。

应该是:

for row in reader:
    writer.writerow([each_file] + row)

【讨论】:

  • 感谢您的建议。我做了那个更正。它现在在 vim 中看起来更整洁,但我在 LibreOffice 中仍然看到同样的问题。所有数据仍然只进入 1 个单元格。
  • @ubuntunoob 你能分享一个重现问题的示例输入文件吗?
【解决方案2】:

尝试使用简单的文本编辑器打开文件。可能问题不在您的代码中。一些电子表格应用程序使用“,”作为分隔符。其他人使用“;”甚至“”或制表符。 如果文件看起来像它应该的样子,请尝试使用不同的分隔符

【讨论】:

    【解决方案3】:

    首先,与您的问题无关:您确定要使用制表符分隔符吗?也许逗号分隔的输出会更好。

    其次,看起来您的输入文件是空格分隔的,但您创建的阅读器使用默认的逗号分隔。您可能想尝试传入分隔符:

    reader = csv.reader(ifile, delimiter=' ')
    

    不确定这是否有帮助,一些示例数据可能有用,所以我可以在这里解决它。

    编辑:我还注意到您正在尝试将文件连接成一个文件?我的假设是否正确?

    为此,我可能会使用其他(即 unix)工具来更快地完成这项工作。如果您的目标是在 python 中做一些有趣的事情,我的建议可能是在循环外声明一个编写器,而不是使用附加模式重新打开同一个文件。

    EDIT2:在不了解您的代码的情况下,我可能会按如下方式处理它:

    writer = csv.writer(open('CSVTrial.csv', 'w'), delimiter='\t', quoting=csv.QUOTE_MINIMAL)
    for each_file in all_the_files:
        file = os.path.join(path, each_file)
        with open(file, "rb") as ifile:
            reader = csv.reader(ifile, delimiter=" ")
            for row in reader:
                writer.writerow([each_file] + row)
    ofile.close()
    

    当然请注意,阅读器文件中的 with 语句旨在避免文件上的显式 close() 。作者可以有一个明确的关闭,或者您可以使用相同的处理。即使发生异常,输入文件也能保证关闭也很好。您必须确保输出文件也关闭,使用一些 try...catch...finally

    希望这会有所帮助!

    【讨论】:

    • 感谢@mlnyc,我尝试了一些方法,发现我的输入文件是制表符分隔的。我试着像你说的那样在阅读器中传入一个分隔符,并将分隔符更改为输出中的逗号。这些组合都没有任何区别。我仍然可以在 vim 中看到输出正常,但在 LibreOffice 中,它仍然在 1 个单元格中为我提供了所有垃圾字符。我应该提供什么样的样本数据?文件中的文本行?
    • 我认为文件中的文本行是一个好的开始。您可能也可以在写出该行之前打印该行以确保它被正确解析。可能还有其他问题,但没有更多信息,我不确定如何诊断它们......如果有帮助,我确实添加了一个完整的示例
    • @ubuntunoob 我将首先列出我认为是真的所有事情。例如,假设可能是:输入文件都正确打开,或者阅读器将所有输入解析为列表。然后验证每个假设是否正确。编程是做假设,调试是验证你的假设:)
    • 感谢@mlnyc 的建议。我试过了,但我遇到了同样的问题。打印出这些行并计算它们告诉我这些行正在被正确解析。正如其他人提到的,这可能是电子表格应用程序的问题。我确实在尝试将文件连接成一个文件 - 你能指出我在 Unix 中帮助我做到这一点的工具吗?
    • @ubuntunoob 好的。现在,您的问题是输出文件正确打开,具有您选择的正确分隔符,但所有文本都在一个文件中?尝试找到与 Excel 的文本到列功能等效的 libreOffice。我们使用制表符作为分隔符,这样您就可以选择。希望有帮助。试试这个:help.libreoffice.org/Calc/Text_to_Columns 如果他们只支持逗号,你可能想将作者的分隔符更改为逗号
    猜你喜欢
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多