我是Python的新手,我正在尝试使用以下格式的数据文本文件:
time_stamp duration 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 ha(01)0.04941113 ah(01)0.04552169 oo(01)0.01065865 o(01)0.00219633
187.110 0.410 bongga(01)1.00000000
187.520 0.349 naman(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文件编译成类似电子表格的内容提出任何其他建议,这样可以更容易地分析数据,我将不胜感激。
答案 0 :(得分:3)
假设分隔符是正确的,这看起来是错误的:
for row in reader:
writer.writerow([each_file,row])
因为那将创建一个恰好有两列的行,其中第二个单元格将包含整个原始行,序列化。
应该是:
for row in reader:
writer.writerow([each_file] + row)
答案 1 :(得分:0)
首先,与您的问题无关:您确定需要制表符分隔符吗?也许以逗号分隔的输出会更好。
其次,看起来您的输入文件是SPACE分隔的,但是您创建了具有默认COMMA分隔符的阅读器。您可能想尝试传递分隔符:
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
希望这有帮助!
答案 2 :(得分:0)
尝试使用简单的文本编辑器打开文件..可能问题不在您的代码中。某些电子表格应用使用“,”作为分隔符。其他人用“;”甚至“”或标签。 如果文件看起来应该是什么,请尝试使用不同的分隔符