我正在编写一个代码,我需要将txt文件中的句子数据集转换为csv文件。这是我的代码工作正常,将输入的txt文件转换为csv文件的格式。
但是,我无法生成输出csv文件。我是python编程的新手,所以我现在还不知道我的方法。
这是我的代码:
def txtTOcsv():
output_csv = []
with open("dataset.txt", "r") as myfile:
lines = myfile.readlines()
for line in lines:
row = line.split()
for i in row[1:]:
tokens = (row[0],i)
print tokens
output_csv.append(tokens)
with open(output_csv,'w') as out_file:
csv.writer(out_file)
直到
才能正常工作print tokens
并按照我的意愿打印所有列之间的逗号。但是当它转到要将输出保存在csv文件中的行时。它给出了这个错误:
with open(output_csv,'w') as out_file:
TypeError: coercing to Unicode: need string or buffer, list found
非常感谢任何帮助。感谢。
答案 0 :(得分:1)
output_csv
是一个列表,open()
需要文件名。
尝试
with open("output.csv",'w') as out_file:
csv.writer(out_file).writerows(output_csv)
答案 1 :(得分:1)
除了Tzach发现的问题外,还有其他一些问题:
没有理由将文件的所有行都读入列表。
无需创建另一个列表来保存所有已处理的行。
如果您处理的文件大小恰好是5GB,那么您的代码会将该数据两次复制到内存中,这需要10GB的内存。这可能会压倒你系统的记忆。
你能做的是:
这样,您一次只能将非常少量的文本读入内存。以下是处理任何大小文件的方法:
import csv
with open("data.txt", newline='') as infile:
with open('csv3.csv', 'w', newline='') as outfile:
writer = csv.writer(outfile)
for line in infile:
first_word, *words = line.split()
for word in words:
writer.writerow([first_word, word])
这一行有点棘手:
first_word, *words = line.split()
如果你这样做:
x, y = ["hello", "world"]
python将分配"你好"到x和"世界"到了。换句话说,python接受右边的第一个元素,并将它分配给左边的第一个变量,然后python接受右边的第二个元素,并将它分配给左边的第二个变量,等等。
接下来,line.split()返回一个列表,产生如下内容:
first_word, *words = ["The", "apple", "is", "red"]
再一次,python将右边的第一个元素分配给左边的第一个变量,所以"""被分配给first_word。接下来,*
告诉python收集右边的其余元素,并将它们全部分配给变量单词,这使得单词成为一个列表。