我正在尝试使用 python 在 jsonl 文件中附加一列 csv 文件。我尝试了以下代码:-
import csv
import json
def csv_column_to_jsonl(csv_file, column_index, jsonl_file):
with open(csv_file, 'r', encoding='utf-8-sig') as file:
reader = csv.reader(file)
data = [row[column_index] for row in reader]
with open(jsonl_file, 'a',encoding='ascii') as file:
for item in data:
json.dump({"text": item}, file)
file.write('\n')
csv_file = 'mydataset.csv'
column_index = 2
jsonl_file = 'jsondata.jsonl'
csv_column_to_jsonl(csv_file, column_index, jsonl_file)
我遇到错误
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xdb in position 0: unexpected end of data
使用chardet,编码类型如下:-
jsondata.jsonl {'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
mydataset.csv {'encoding': 'UTF-8-SIG', 'confidence': 1.0, 'language': ''}
唯一有效并在 jsonl 文件中附加 csv 的组合是当我对 csv 文件使用encoding=unicode_escape 时,但在这种情况下。生成的 jsonl 显示数据如下:-
索引 4 之前是之前的数据,而从索引 120315 开始,显示的附加数据不匹配。请让我知道要修改我的代码中的哪些内容。
我很高兴你解决了这个问题。我什至不认为 JSON 文件可能是问题所在,并且完全错过了 chardet 对它是 ASCII 的评估。
将来当您遇到这样的问题时(我应该先问这个问题),准确地知道哪个文件有问题将会很有帮助。当您运行该程序并收到错误时,您可能会看到一个堆栈跟踪,它指向一条指示 JSON 文件的行,而不是 CSV 文件——我将您的问题解释为主要与此相关。
如果堆栈跟踪没有意义,并且您认为/知道多个文件之一有问题,请尝试添加一些代码以准确指出哪个文件有问题。由于您已经收到 UnicodeDecodeError 您可以尝试捕获该错误,例如:
try:
with open(csv_file, 'r', encoding='utf-8-sig') as file:
reader = csv.reader(file)
data = [row[column_index] for row in reader]
except UnicodeDecodeError as e:
print(f"couldn't decode {csv_file} with 'utf-8-sig': {e}")
...
并对 JSON 文件重复此操作。如果您碰巧遇到 UnicodeDecodeError 以外的其他错误,您将看到另一个堆栈跟踪错误组合,您可以专注于此...耶,调试!
我相信如果你这样做,你会得到非常明确的信息:
couldn't decode jsondata.jsonl with 'ascii': UnicodeDecodeError: 'utf-8' codec can't decode byte 0xdb in position 0: unexpected end of data
祝你好运!