我有以下代码试图迭代一些项目:
这是输入(单行)
操作,SKU,ITEM_NAME,UPC,EAN,BRAND_NAME
filename=open("WebstoreItemTemplate.csv").read()
template=csv.reader(filename,delimiter=',')
for row in template:
print row
Run Code Online (Sandbox Code Playgroud)
我期待输出看起来一样,如:
['operation','sku','item_name','upc,ean','brand_name']
Run Code Online (Sandbox Code Playgroud)
相反,我收到以下输出,每个字母被视为一个列表.我已经验证该文件是csv格式,所以我不确定我做错了什么.
['o']
['p']
['e']
['r']
['a']
['t']
['i']
['o']
['n']
['', '']
['s']
['k']
['u']
['', '']
['i']
['t']
['e']
['m']
['_']
['n']
['a']
['m']
['e']
['', '']
['u']
['p']
['c']
['', '']
['e']
['a']
['n']
['', '']
['b']
['r']
['a']
['n']
['d']
['_']
['n']
['a']
['m']
['e']
Run Code Online (Sandbox Code Playgroud)
Pad*_*ham 12
删除.read
并只传递文件对象:
with open("WebstoreItemTemplate.csv") as filename:
template=csv.reader(filename)
for row in template:
print row
Run Code Online (Sandbox Code Playgroud)
哪个会给你:
['operation', 'sku', 'item_name', 'upc', 'ean', 'brand_name']
Run Code Online (Sandbox Code Playgroud)
来自文档:
csv.reader(csvfile,dialect ='excel',**fmtparams)
返回一个读取器对象,它将迭代给定csvfile中的行.csvfile可以是任何支持迭代器协议的对象,每次调用next()方法时都返回一个字符串 - 文件对象和列表对象都是合适的.
基本上这种情况正在发生:
In [9]: next(iter("foo"))
Out[9]: 'f'
Run Code Online (Sandbox Code Playgroud)
splitlines()
你只需要在调用read后调用即可。传递文件对象并不总是理想或必需的。
例如从字符串中读取:
import csv
rawdata = 'name,age\nDan,33\nBob,19\nSheri,42'
myreader = csv.reader(rawdata.splitlines())
for row in myreader:
print(row[0], row[1])
Run Code Online (Sandbox Code Playgroud)
就我而言,我只想使用 chardet 检测编码:
with open("WebstoreItemTemplate.csv") as f:
raw_data = f.read()
encoding = chardet.detect(raw_data)['encoding']
cr = csv.reader(raw_data.decode(encoding).splitlines())
...
Run Code Online (Sandbox Code Playgroud)
以下是我个人认为有用的一些实际示例: http://2017.compciv.org/guide/topics/python-standard-library/csv.html
归档时间: |
|
查看次数: |
2578 次 |
最近记录: |