如何从 zip 文件夹中的 csv 文件中读取数据并将 csv 文件中的数据保存在数据库中?
Posted
技术标签:
【中文标题】如何从 zip 文件夹中的 csv 文件中读取数据并将 csv 文件中的数据保存在数据库中?【英文标题】:How to read from a csv file in zip folder and save data from csv file in database? 【发布时间】:2020-01-02 19:45:08 【问题描述】: import glob
import os
import csv
import zipfile
from io import StringIO
for name in glob.glob('C:/Users/RAMESH SANTHA/Downloads/download-NIFTY 50-01012020.zip'):
base = os.path.basename(name)
filename = os.path.splitext(base)[0]
datadirectory = 'C:/Users/RAMESH SANTHA/Downloads/'
dataFile = filename
archive = '.'.join([dataFile, 'zip'])
fullpath = ''.join([datadirectory, archive])
csv_file = '.'.join([dataFile, 'csv']) #all fixed
filehandle = open(fullpath, 'rb')
zfile = zipfile.ZipFile(filehandle)
data = StringIO.StringIO(zfile.read(csv_file))
reader = csv.reader(data)
for row in reader:
print (row)
我尝试使用以下代码从包含 csv 文件和打印行的 zip 文件夹中读取数据,但出现错误:
data = StringIO.StringIO(zfile.read(csv_file))
AttributeError: type object '_io.StringIO' has no attribute 'StringIO'
【问题讨论】:
所以,我要做的是使用 Python 将文件夹解压缩到一个临时位置,然后迭代地读取该结果文件夹中的所有 csv 文件,对该文件进行所需的任何处理,然后当你完成,删除该临时文件夹。数据的处理虽然是主观的,因为我不知道您的数据库是如何定义的,或者您希望如何保留数据。如果这是一个有效的工作流程,我可以为你写出来,但你确实看到了我的未知数。如果您可以编辑问题以澄清所述未知数,那么我们可以努力获得更好的答案。 没有StringIO.StringIO
,而是io.StringIO
(如果你使用import io
)。但是如果你使用from io import StringIO
,那么你只需要data = StringIO(...)
顺便说一句:pandas.read_csv()
可以直接从.zip
文件中读取。
我认为你使用 glob
过度复杂的代码看起来你没有 zip 文件夹但 normla zip 文件,你可以直接在 open()
- open('C:/Users/RAMESH SANTHA/Downloads/download-NIFTY 50-01012020.zip')
中使用你的路径
【参考方案1】:
没有StringIO.StringIO()
,而是io.StringIO()
import io
data = io.StringIO(...)
有了你的导入,即使没有io.
from io import StringIO
data = StringIO(...)
顺便说一句:我认为您使用 glob
和 join()
使代码过于复杂。你可以直接使用文件名ZipFile
而不使用open()
import os
import csv
import zipfile
import io
zip_fullname = 'C:/Users/RAMESH SANTHA/Downloads/download-NIFTY 50-01012020.zip'
zip_file = os.path.basename(zip_fullname)
csv_file = zip_file.replace('.zip', '.csv')
print(zip_file) # download-NIFTY 50-01012020.zip
print(csv_file) # download-NIFTY 50-01012020.csv
zfile = zipfile.ZipFile(zip_fullname)
data = io.StringIO(zfile.read(csv_file).decode('utf-8')) # bytes needs to be converted to string
reader = csv.reader(data)
for row in reader:
print(row)
但是使用pandas
应该会更简单
import pandas as pd
df = pd.read_csv('C:/Users/RAMESH SANTHA/Downloads/download-NIFTY 50-01012020.zip')
print(df)
【讨论】:
感谢您解决问题。上述代码有效,但在行 data = io.StringIO(zfile.read(csv_file)) 中进行了小修正,应将其替换为 encoding = 'utf-8' data = io.StringIO((zfile.read(csv_file)).decode(encoding)) 因为 Zfile.read(csv_file) 返回需要使用解码方法转换为字符串的字节。 @rameshsantha 你是对的,我没有测试它。它也应该适用于没有encoding = 'utf-8'
的.decode()
,因为它应该使用utf-8
作为默认值。至少在 Linux(我使用的)上,它默认使用 utf-8
。【参考方案2】:
查看从 zip 文件打开 csv 文件时出错的脚本。下面是我为一个包含几个 csv 的 zip 文件工作的 python 3 代码。在运行脚本之前要提取的目录应该存在
import zipfile
path_to_zip_file='/tmp/test1.zip' # Assuming this file exist , This path is from mac, but should work for windows as well'
directory_to_extract_to='/tmp/extract/' # Assuming this directory already exist
import csv,os
import codecs
import glob
with zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:
zip_ref.extractall(directory_to_extract_to)
for file in glob.glob(directory_to_extract_to+'*.csv'):
path = os.path.join(directory_to_extract_to,file)
with open(path, 'rb') as f:
reader = csv.reader(codecs.iterdecode(f, 'utf-8'))
# Below code is print them as arrays
# for row in reader:
# print(row)
# Reading rows as ordered dictionary
dictReader = csv.DictReader(codecs.iterdecode(f, 'utf-8'))
for row in dictReader:
print(row)
【讨论】:
以上是关于如何从 zip 文件夹中的 csv 文件中读取数据并将 csv 文件中的数据保存在数据库中?的主要内容,如果未能解决你的问题,请参考以下文章
读取 zip 中的所有 csv 文件,并将相应的 csv 文件名作为数据帧变量名
如何使用 spark(python)读取 zip 文件中的 CSV 文件的内容 [重复]