CSV Should Return Strings, Not Bytes Error

2019-09-12 10:22发布

I am trying to read CSV files from a directory that is not in the same directory as my Python script.

Additionally the CSV files are stored in ZIP folders that have the exact same names (the only difference being one ends with .zip and the other is a .csv).

Currently I am using Python's zipfile and csv libraries to open and get the data from the files, however I am getting the error:

Traceback (most recent call last):   File "write_pricing_data.py", line 13, in <module>
    for row in reader:
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

My code:

import os, csv
from zipfile import *

folder = r'D:/MarketData/forex'
localFiles = os.listdir(folder)

for file in localFiles:
    zipArchive = ZipFile(folder + '/' + file)

    with zipArchive.open(file[:-4] + '.csv') as csvFile:
        reader = csv.reader(csvFile, delimiter=',')

        for row in reader:
            print(row[0])

How can I resolve this error?

1条回答
贪生不怕死
2楼-- · 2019-09-12 10:56

It's a bit of a kludge and I'm sure there's a better way (that just happens to elude me right now). If you don't have embedded new lines, then you can use:

import zipfile, csv

zf = zipfile.ZipFile('testing.csv.zip')
with zf.open('testing.csv', 'r') as fin:
    # Create a generator of decoded lines for input to csv.reader
    # (the csv module is only really happy with ASCII input anyway...)
    lines = (line.decode('ascii') for line in fin)
    for row in csv.reader(lines):
        print(row)
查看更多
登录 后发表回答