我第一次遇到将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/