我正在将我的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
任何想法?
答案 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将文件作为字符串读取。