如何从 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(...)

顺便说一句:我认为您使用 globjoin() 使代码过于复杂。你可以直接使用文件名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 文件?

读取 zip 中的所有 csv 文件,并将相应的 csv 文件名作为数据帧变量名

如何使用 spark(python)读取 zip 文件中的 CSV 文件的内容 [重复]

从 Python3 中的 .zip 文件中提取和读取 [重复]

如何从压缩文件中读取多个文件?

如何提取多个 zip 文件并在 R 中读取这些 csv? [复制]