csv读取文件困难

时间:2018-10-12 04:24:09

标签: python python-3.x csv

编写一个名为“ csv_to_kvs”的函数,该函数将一个字符串作为参数来表示CSV文件的名称,该文件具有4列,格式为“字符串,浮点,浮点,浮点”,并返回一个新的键值存储映射字符串到浮点数字。返回的键值存储将为文件中的每一行提供一对,其中CSV文件的第一列中的键来自第三列中的值。 (下面的代码)

import csv
def csv_to_kvs(string):
    with open(string) as f:
        file = csv.DictReader(f)
        for column in file:
            for key in column.keys():
                return key
             for value in column.values():
                return value

提交以下函数csv_to_kvs时,输入错误。

输入experienced.csv

spite,-11.09,3.92,7.38
questionnaire,12.8,-4.39,-0.14
literally,19.5,-3.94,-5.06
colleague,17.19,-15.3,0.12

返回:"spite"

预期:{'colleague': -15.3, 'spite': 3.92, 'questionnaire': -4.39, 'literally': -3.94}

3 个答案:

答案 0 :(得分:1)

csv.DictReader希望标题是第一行的列,而不是第一列的行。

您应该改为使用csv.reader来读取行,并以zip对其进行转置,以将第一个项目作为标头解包,将其余的作为数据解压缩,然后使用列表推导来构造字典列表:

with open(string) as f:
    headers, *data = zip(*csv.reader(f))
    l = [{header: item for header, item in zip(headers, lst)} for lst in data]

使用示例输入,l将变为:

[{'spite': '-11.09', 'questionnaire': '12.8', 'literally': '19.5', 'colleague': '17.19'}, {'spite': '3.92', 'questionnaire': '-4.39', 'literally': '-3.94', 'colleague': '-15.3'}, {'spite': '7.38', 'questionnaire': '-0.14', 'literally': '-5.06', 'colleague': '0.12'}]

,第三列将简单地为l[1]

{'spite': '3.92', 'questionnaire': '-4.39', 'literally': '-3.94', 'colleague': '-15.3'}

答案 1 :(得分:0)

您可以使用csv.reader()。这可以帮助您将row读为list

import csv
def csv_to_kvs(string):
  with open(string) as f:
    my_file = csv.reader(f)
    my_dict = {}
    for row in my_file:
     # as you want to key value as the first one and value will be third one
       my_dict[row[0]] = row[2]
    return my_dict

输出: {'spite': '3.92', 'questionnaire': '-4.39', 'literally': '-3.94', 'colleague': '-15.3'}

答案 2 :(得分:0)

Python Pandas is a great library to read and write CSV files

* Read CSV file - 

import pandas as pd
data = pd.read_csv("filename.csv")
data.head()

* Write CSV file - 

import pandas as pd
result = {Any key value pair data}
df = pd.DataFrame(data=result)
df.to_csv(filepath.csv, sep='\t', encoding='utf-8')