从python中的多个压缩文件中提取csv文件

时间:2019-12-07 21:57:58

标签: python csv

我写了一个脚本,可以从多个csv中提取文本。有人可以帮我将脚本嵌入其中吗,该脚本可以从不同的压缩文件中读取csv数据,并在一个位置创建多个csv(每个压缩文件一个)。 例如-如果我在压缩文件夹z1中有10个csv,在压缩文件夹z2中有5个csv。我想从每个压缩文件中提取文件,并将提取的文件放在一个位置。在这种情况下,它将是z1.csv(带有来自10个csv的串联数据)和z2.csv(带有来自5个csv的串联数据)。 我正在使用以下脚本,

allfiles=glob.glob(os.path.join(input_fldr,"*.csv"))
a=[]
b=[]
for file_ in allfiles:
    dirname, filename=os.path.split(file_)
    f=open(file_,'r',encoding='UTF-8')
    lines=f.readlines()
    f.close()
    for line in lines:
        if line.startswith('Hello'):
        a.append(filename)
        b.append(line)
df_a=pd.DataFrame(a,columns=list("A")
df_b=pd.DataFrame(b,columns=list("B")
df=pd.concat([df_a,df_b],axis=1)

1 个答案:

答案 0 :(得分:0)

代码

我来到的代码大致上是我认为您想要发生的事情(此示例中需要的所有文件都是available here):

import zipfile
import pandas as pd

virtual_csvs = []

with zipfile.ZipFile("test3.zip", "r") as f:
    for name in f.namelist():
        if name.endswith(".csv"):
            data = f.open(name)
            virtual_csvs.append(pd.read_csv(data, header=None))

pd.concat(virtual_csvs, axis=1).to_csv('test4.csv', header=False, index=False)

代码分解

virtual_csvs = []

我们首先创建一个存储所有熊猫DataFrame的数组,就像您的数组[df_a, df_b]

with zipfile.ZipFile("test3.zip", "r") as f:

这将加载zip文件“ test3.zip”-在读取模式下用您的zip文件名替换为变量f

for name in f.namelist():

这会遍历zip文件中的每个文件名,并将其加载到变量name

if name.endswith(".csv"):

此行是不言自明的-如果文件的扩展名为.csv,请运行以下代码。

data = f.open(name)

f.open(name)命令打开文件(name)-等效为open(name, 'r') as data

virtual_csvs.append(pd.read_csv(data, header=None))

pd.read_csv(data, header=None)将该文件加载到熊猫数据框中(header = None表示没有列标题,因此数据已加载到数据框中)

virtual_csvs.append将数据帧加载到virtual_csvs列表中

此代码的最后一行:

pd.concat(virtual_csvs, axis=1).to_csv('output.csv', header=False, index=False)

将所有csv文件连接为一个更大的文件(“ output.csv”)。 pd.concat(virtual_csvs, axis=1)意味着按列连接virtual_csvs中的所有csv文件(DataFrame)(这将返回pd.DataFrame

to_csv('output.csv', header=False, index=False)意味着将给定的DataFrame转换为名为'output.csv'的csv文件。

header=False意味着删除每一列的标题名称

index=False禁用数据帧中的行号