Python 3中的CSV .count?

时间:2014-06-01 17:05:39

标签: python csv python-3.x

我正在将我的python脚本切换到python 3,而且我无法移植我的部分csv评估代码。

在python 2.7.5中,这段代码运行得很好:

filename=askopenfilename()

with open(filename, 'rb') as Order:
    reader = csv.reader(Order, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
    OrderList = []
    first = Order.next()
    if (first.count("Web ID") == 1):
        OrderList.append("Digi-key")
        OrderList.append(first)

现在我已经将Order.next()行更改为next(Order),因此它可以使用w / python 3,虽然我似乎无法找到与if (first.count("Web ID") == 1): <等效的python 3 / p>

我已经查看了Python 3的CSV模块文档,但我可能错过了一些内容,而且我没有做最大的尝试来解决它。

我试图评估的部分是这个(改变数字以保持隐私):

Web ID,Access ID,Salesorder Number,Shipping Method,Payment Method,
49488634,84901,37873472,U.S. Postal Service Priority Mail* (2-3 Day Delivery to most US addresses)(order by 8:00 PM CT),Foo,

Shipping Address
...

目前的错误是:

TypeError: Type str doesn't support the buffer API

任何想法?

3 个答案:

答案 0 :(得分:4)

方法count由字符串或列表实现。在您的情况下,您在字符串上调用它,您可以通过调用其next方法从文件对象中检索该字符串。在Python 3上,当您以二进制模式打开文件时,您将获得一个可迭代的字节串,而不是字符串。类型bytes也实现count,但您只能计算字节字符串中字节串的出现次数,否则会得到TypeError

In [1]: b'hello'.count(b'el')
Out[1]: 1

In [2]: b'hello'.count('el')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-df699ac18654> in <module>()
----> 1 b'hello'.count('el')

TypeError: Type str doesn't support the buffer API

您可能必须以文本模式打开文件以进行CSV解析,因为 csv.reader documentation说:

  

csv.reader(csvfile, dialect='excel', **fmtparams)

     

退回读者   将遍历给定csvfile中的行的对象。 csvfile可以   是任何支持迭代器协议并返回一个的对象   每次调用__next__()方法时,字符串 - 文件对象和   列表对象都是合适的。

注意强调单词&#34; string&#34;我补充说。您应该以文本模式打开文件,最好使用newline=''打开文件,如链接页面所示。​​

另外,您可以将first = next(order)更改为first = next(reader)。通过这种方式,您将拥有一个字符串列表(一行),并且计算其中某个字符串的出现次数可能会更加健壮。

答案 1 :(得分:0)

根据csv模块(https://docs.python.org/3.4/library/csv.html?highlight=csv#csv)的python文档,为了在Python 3中翻译该方法,你应该在CSV阅读器对象上使用next()函数:

csvreader.__next__()

Return the next row of the reader’s iterable object as a list, parsed according to the current dialect. Usually you should call this as next(reader).

我希望这会对你有所帮助

干杯

答案 2 :(得分:0)

问题在于使用mode ='rb'打开文件。我发现如果你打开模式'r',它应该工作:

with open(filename, 'r') as Order:

当使用'rb'打开时,Python3将文件解释为一系列字节并按原样读取内容。使用mod'r',Python3将文件作为字符串读取。