我第一次遇到将csv载入Python的问题。

我正在尝试this。我的csv文件与他的csv文件相同,但是更长,并且具有不同的值。

当我运行这个

import collections
path='../data/struc.csv'
answer = collections.defaultdict(list)
with open(path, 'r+') as istream:
    for line in istream:
        line = line.strip()
        try:
            k, v = line.split(',', 1)
            answer[k.strip()].append(v.strip())
        except ValueError:
            print('Ignoring: malformed line: "{}"'.format(line))

print(answer)


一切运行正常。我完全符合您的期望。

在没有复制并粘贴link中的代码的情况下,在两种情况下,我都会遇到错误。

在接受的答案中,终端吐出ValueError:需要多个值来解压

在第二个答案中,我得到AttributeError:'file'对象没有属性'split'。如果将其调整为列表,它也不起作用。

我觉得问题出在csv文件本身。它的头是

_id,parent,name,\nSection,none,America's,\nSection,none,Europe,\nSection,none,Asia,\nSection,none,Africa,\nCountry,America's,United States,\nCountry,America's,Argentina,\nCountry,America's,Bahamas,\nCountry,America's,Bolivia,\nCountry,America's,Brazil,\nCountry,America's,Colombia,\nCountry,America's,Canada,\nCountry,America's,Cayman Islands,\nCountry,America's,Chile,\nCountry,America's,Costa Rica,\nCountry,America's,Dominican Republic,\n
我已经阅读了很多有关csv的内容,尝试了导入csv的内容,但仍然没有运气。
请有人帮忙。遇到这种问题是最糟糕的。

import re
from collections import defaultdict

parents=defaultdict(list)
path='../data/struc.csv'

with open(path, 'r+') as istream:
    for i, line in enumerate(istream.split(',')):
        if i != 0 and line.strip():
            id_, parent, name = re.findall(r"[\d\w-]+", line)
            parents[parent].append((id_, name))



Traceback (most recent call last):

  File "<ipython-input-29-2b2fd98946b3>", line 1, in <module>
runfile('/home/bob/Documents/mega/tree/python/structure.py',       wdir='/home/bob/Documents/mega/tree/python')

  File "/home/bob/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 685, in runfile
    execfile(filename, namespace)

   File "/home/bob/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 78, in execfile
    builtins.execfile(filename, *where)

  File "/home/bob/Documents/mega/tree/python/structure.py", line 15, in <module>
    for i, line in enumerate(istream.split(',')):

AttributeError: 'file' object has no attribute 'split'

最佳答案

首先,Python在其标准库中有一个特殊的模块,用于处理各种口味的CSV。请参阅documentation

当CSV文件具有标题时,csv.DictReader可能是解析文件的更直观的方法:

import collections
import csv

filepath = '../data/struc.csv'
answer = collections.defaultdict(list)

with open(filepath) as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        answer[row["_id"].strip()].append(row["parent"].strip())

print(answer)


您可以通过标题中的名称来引用行中的字段。在这里,我假设您想使用_id和parent,但是您明白了。

另外,可以将dialect=csv.excel_tab作为参数添加到DictReader,以解析制表符分隔的文件。

关于python - Python CSV问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33584332/

10-08 22:57