TypeError: coercing to unicode need string or buffer, list found
TypeError: coercing to unicode need string or buffer, list found
我正在编写代码,需要将 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
如有任何帮助,我们将不胜感激。谢谢。
output_csv
是一个列表,open()
需要一个文件名。
尝试
with open("output.csv",'w') as out_file:
csv.writer(out_file).writerows(output_csv)
除了 Tzach 指出的问题外,还有其他几个问题:
没有理由将文件的所有行读入一个列表。
无需创建另一个列表来保存所有已处理的行。
如果您处理的文件大小恰好为 5GB,那么您的代码会将该数据复制两次到内存中,这将需要 10GB 的内存。这可能会使您的系统内存不堪重负。
您可以做的是:
- 读一行。
- 处理行。
- 将处理后的行写入csv文件。
- 阅读下一行。
这样一来,您一次只能将非常少量的文本读入内存。以下是处理任意大小文件的方法:
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 会将 "hello" 分配给 x,将 "world" 分配给 y。换句话说,python取右边第一个元素,赋给左边第一个变量,然后python取右边第二个元素,赋给左边第二个变量左边等等
接下来,line.split() returns 一个列表,产生如下内容:
first_word, *words = ["The", "apple", "is", "red"]
再一次,python 将右侧的第一个元素分配给左侧的第一个变量,因此 "The" 被分配给 first_word。接下来,*
告诉 python 收集右边的其余元素并将它们全部分配给变量 words,这使得 words 成为一个列表。
我正在编写代码,需要将 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
如有任何帮助,我们将不胜感激。谢谢。
output_csv
是一个列表,open()
需要一个文件名。
尝试
with open("output.csv",'w') as out_file:
csv.writer(out_file).writerows(output_csv)
除了 Tzach 指出的问题外,还有其他几个问题:
没有理由将文件的所有行读入一个列表。
无需创建另一个列表来保存所有已处理的行。
如果您处理的文件大小恰好为 5GB,那么您的代码会将该数据复制两次到内存中,这将需要 10GB 的内存。这可能会使您的系统内存不堪重负。
您可以做的是:
- 读一行。
- 处理行。
- 将处理后的行写入csv文件。
- 阅读下一行。
这样一来,您一次只能将非常少量的文本读入内存。以下是处理任意大小文件的方法:
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 会将 "hello" 分配给 x,将 "world" 分配给 y。换句话说,python取右边第一个元素,赋给左边第一个变量,然后python取右边第二个元素,赋给左边第二个变量左边等等
接下来,line.split() returns 一个列表,产生如下内容:
first_word, *words = ["The", "apple", "is", "red"]
再一次,python 将右侧的第一个元素分配给左侧的第一个变量,因此 "The" 被分配给 first_word。接下来,*
告诉 python 收集右边的其余元素并将它们全部分配给变量 words,这使得 words 成为一个列表。