首页 > 解决方案 > 如何正确读取带单引号的 csv 文件?

问题描述

尝试读取.csv-file,其中的行如下所示:

gif,940ff2312-4325-8898dfs-9ce1ca56c5sfb,'[{"mid": "/m/083dsf", "description": "buff", "probability": 0.9663228988647461, "topic": 0.9663228988647461}]'

我需要阅读这些行并将其放入两个列表中:gifbif. 每个列表必须包含对元组:第一个字符串(在我的示例中为 'gif'),字典列表(在我的示例中单引号中的第三个元素)。

我不知道如何正确解析它,因为read_csv这样做会引发错误。尝试了简单的字符串方法,它可以工作,但是修复字典列表很复杂,我认为它不是很好/不是最优的。试过 JSON --- 不工作。

这是我的方法:

gif = []
bif = []

with open('file.csv', 'r', encoding = 'utf-8') as file:
    lines = file.readlines()
    for line in lines:
        obj = line[:line.find(',')]
        arr = line[line.find('['):-2]
        json_acceptable_string = arr.replace("'", "\"")
        arr = json.loads(json_acceptable_string)
        
        if obj == 'gif':
            gif.append((obj, arr))
        elif obj == 'bif':
            bif.append((obj, arr))

任何想法如何解决它?也许有一些误解和好的技巧pandas

UPD:我也试过这样:

import csv

gif = []
bif = []

with open('file.csv', 'rt', encoding='utf-8') as file:
    csv_reader = csv.reader(file, delimiter=',', quotechar="'")
    for line in csv_reader:
        for obj, Id, objArr in line: # here I'm trying to split it in 3 objects
            if obj == 'gif':
                gif.append((obj, arr))
            elif obj == 'bif':
                bif.append((obj, arr))

但它提出了:

ValueError: too many values to unpack (expected 3)

标签: pythonpandascsvdatatable

解决方案


您可以使用quotechar format 参数正确解析单引号 JSON 字符串:

import csv
with open('file.csv') as csv_file:
    reader = csv.reader(csv_file, delimiter=',', quotechar="'")
    for row in reader:
        print(row)
        # If you want to parse the json, you can do:
        # `json.loads(row[-1])` (requires the json module)
        # Kudos to @juanpa.arrivillaga for the suggestion!

根据您提供的示例数据,这会产生以下输出:

['gif', 
 '940ff2312-4325-8898dfs-9ce1ca56c5sfb', 
 '[{"mid": "/m/083dsf", "description": "buff", "probability": 0.9663228988647461, "topic": 0.9663228988647461}]']

推荐阅读