【问题标题】:How can I put a CSV file in an array?如何将 CSV 文件放入数组中?
【发布时间】:2015-02-03 19:13:54
【问题描述】:

我正在读取一个 CSV 文件,我想把它放在一个数组中,这样我就可以根据行索引快速查找信息。这就是我得到的,但似乎该行不能使用 split()。有什么建议吗?

print csvFilePath
a = []

reader = csv.reader(open(csvFilePath,'rU'),dialect=csv.excel_tab)
print reader
for row in reader:
    print row
    a.append(row.split(','))

print a[45]['firstname']

【问题讨论】:

  • print a[45]['firstname'] 应该做什么以及您的数据是什么样的?行也是一个列表,所以你不能拆分它是有意义的
  • 您似乎不想使用数组而是列表。
  • 你可能只是想做a.append(row)
  • 看起来更像是您想将其放入字典列表中。

标签: python arrays csv multidimensional-array python-2.x


【解决方案1】:

您最需要的是DictReader(正如布鲁诺指出的那样。他扣动扳机的速度更快。)。它接受文件名并将每一行作为字典返回,这是您想要的。这将使您的代码:

import csv
a = []

reader = csv.DictReader(open("so.csv",'rU'), dialect=csv.excel_tab, delimiter=',')
print reader
for row in reader:
    print row
    a.append(row)

print a[2]['Make']

可以选择简化为:

import csv
with open("so.csv",'rU') as f:
    a = list(csv.DictReader(f, dialect=csv.excel_tab, delimiter=','))
print a[2]['Make']

使用一些示例数据(来自Wikipedia):

Year,Make,Model,Description,Price
1997,Ford,E350,"ac, abs, moon",3000.00
1999,Chevy,"Venture ""Extended Edition""","",4900.00
1999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.00
1996,Jeep,Grand Cherokee,"MUST SELL!
air, moon roof, loaded",4799.00

打印:

<csv.DictReader instance at 0x7fe7a3aedfc8>
{'Price': '3000.00', 'Description': 'ac, abs, moon', 'Make': 'Ford', 'Model': 'E350', 'Year': '1997'}
{'Price': '4900.00', 'Description': '', 'Make': 'Chevy', 'Model': 'Venture "Extended Edition"', 'Year': '1999'}
{'Price': '5000.00', 'Description': '', 'Make': 'Chevy', 'Model': 'Venture "Extended Edition, Very Large"', 'Year': '1999'}
{'Price': '4799.00', 'Description': 'MUST SELL!\nair, moon roof, loaded', 'Make': 'Jeep', 'Model': 'Grand Cherokee', 'Year': '1996'}
Chevy

这假设您的文件以Year,Make,Model,Description,Price 之类的标题开头,以提供密钥。如果没有,您可以将标头作为列表传递给DictReader

reader = csv.DictReader(open("so.csv",'rU'), ["Year", "Make", "Model", "Description", "Price"], dialect=csv.excel_tab, delimiter=',')

另请注意,随地吐痰的字符由 delimiter=',' 参数给出。

【讨论】:

    【解决方案2】:

    好吧,csv 模块的全部意义在于避免自己解析 csv 文件,所以不,row“不能使用拆分”,因为它已经(正确地)“拆分”成一个列表。如果你想要一个行列表,那么它就像

    一样简单
    with  open(csvFilePath,'rU') as f:
        reader = csv.reader(f), dialect=csv.excel_tab)
        a = list(reader)
    

    现在,如果您想要一个 dicts 列表(这样您就可以使用 a[45]['firstname']),您将不得不使用 csv.DictReader() 代替(https://docs.python.org/2/library/csv.html#csv.DictReader),或者从行和列表中构建 dict标题,即:

    headers = ["firstname", "lastname", "has_parrot",]
    with  open(csvFilePath,'rU') as f:
        reader = csv.reader(f), dialect=csv.excel_tab)
        a = [dict(zip(headers, row)) for row in reader]
    

    但真正使用csv.DictReader 是您更好的选择。

    【讨论】:

      【解决方案3】:

      Python默认支持两种csv文件,一种是这样,逗号分隔:

      1,2,3
      

      另一个是这样的,制表符分隔:

      1    2    3
      

       1\t2\t3
      

      现在假设你有这些原始数据:

       firstname,surname,..
       Adam,Smith,...
       ...
      

      现在,根据您的类型,您可以使用我的迷你包装库来获取您想要的二维数据:

       >>> import pyexcel as pe
       >>> sheet = pe.load("your_file.csv", name_columns_by_row=0) # or "your_file.tsv"
       >>> records = sheet.to_records()
       >>> records[45]["firstname"]
      

      详细文档是here

      【讨论】:

        猜你喜欢
        • 2019-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-10
        • 2021-08-18
        • 1970-01-01
        相关资源
        最近更新 更多