csv.reader()按个别字符分隔值

Ben*_*ang 8 python csv

我有以下代码试图迭代一些项目:

这是输入(单行)

操作,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)

  • `csv.reader`需要一个文件对象提供的行迭代器.`.read()`生成一个字符串.您可以执行`open(filename).read().split("\n")`但直接传递文件对象效率更高. (3认同)

And*_*eas 5

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