【问题标题】:Converting a CSV File to Typed Tuples将 CSV 文件转换为类型化元组
【发布时间】:2020-01-23 12:14:54
【问题描述】:

我是一名刚开始学习 python 的 Java 程序员。我的第一个任务对我来说似乎很奇怪,我不知道如何处理它。我们得到一个 csv 文件,并被要求读取 csv 文件并返回代表数据的元组列表,将每个字段转换如下:

#      date: class date (see datetime module)
#      mileage: integer
#      location: string 
#      gallons: float
#      cost: float    
# Do not return a tuple for the header row.  While you can process the rawtext using string 
# functions, to receive full credit you must use Python's built in csv module. 

我真的不知道从哪里开始,尽管我想我已经知道如何读取 csv 文件了。 这是我目前所拥有的。

rows = []
with open(file_name) as f:
    rows=[tuple(line) for line in csv.reader(f)]
return rows

编辑:添加我的 csv 文件。 http://www.filedropper.com/mustarddata

【问题讨论】:

  • 您是否包含您的 csv 文件样本?
  • 您期望该示例文件的输出是什么?
  • 似乎文件的每一行都有 5 列 - 您需要将每一列转换为其指定的类型(日期、整数、字符串(无需转换)、浮点数、浮点数)并用这些创建一个元组解析/转换的值。将元组添加到列表中。你的问题在哪里?您目前只读取字符串并按原样使用它们 - 您不会转换任何您需要做的主要任务......
  • 查看changing-strings-to-floats-in-an-imported-csv 并阅读有关将字符串转换为日期的strptime

标签: python csv


【解决方案1】:

您可以遍历您生成的元组列表,根据需要转换每个值,并将其附加到新的最终列表中。或者,您可以在遍历文件行时立即执行此操作:

import csv
from datetime import datetime

data=[]

with open('mustard_data.csv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    line_count = 0
    for line in csv_reader:
        # Ignore the header row
        if line_count == 0:
            line_count += 1
            continue
        else:
            # Ignore lines with missing values (or handle them otherwise if required)
            if '' not in line:  
                # Convert as appropriate
                datetime_object = datetime.strptime(line[0], '%m/%d/%Y').date()
                mileage = int(line[1])
                loc = line[2]
                gallons = float(line[3])
                cost = float(line[4].strip('$'))
                data.append((datetime_object, mileage, loc, gallons, cost))

【讨论】: