python - Python - 爬取目录、从 ZIP 中提取 CSV 文件以及组合多个 CSV
问题描述
我有一个使用 pandas 组合多个 ZIP 文件的 Python 脚本。我正在使用托管在 GitHub 存储库中的奥地利 COVID-19 病例数据:https ://github.com/statistikat/coronaDAT
我试图让它在 GitHub 存储库中抓取目录结构(所有文件夹和子文件夹),识别 ZIP 文件,然后从 ZIP 文件中提取特定的 CSV 文件并组合 CSV。在这种情况下,将所有标题为“Bezirke.csv”的 CSV 文件合并为一个。
我有一个在当前工作文件夹中执行此操作的脚本的工作版本,但不会抓取目录结构或进入子文件夹。看到这个问题。
我现在正在尝试使用os.walk(rootPath)
爬取结构。它似乎正在工作,但停止并显示错误消息:
Traceback (most recent call last):
File "merge_zip_entire_directory.py", line 21, in <module>
zip_file = ZipFile(filename)
File "/Users/matt/opt/anaconda3/lib/python3.7/zipfile.py", line 1240, in __init__
self.fp = io.open(file, filemode)
FileNotFoundError: [Errno 2] No such file or directory: '20200422_060000_orig_csv.zip'
我已验证该特定 zip 文件有一个名为“Bezirke.csv”的文件。我不明白为什么我会收到错误消息。
这是完整的脚本:
import fnmatch
import os
import pandas as pd
from zipfile import ZipFile
#set root path
rootPath = r"/Users/matt/OneDrive/Documents/04 Employment/Employers/State Department/COVID-19/test/"
#set file pattern
pattern = '*.zip'
#initialize variables
df_master = pd.DataFrame()
flag = False
#crawl entire directory in root folder
for root, dirs, files in os.walk(rootPath):
#filter files that match pattern of .zip
for filename in fnmatch.filter(files, pattern):
#
zip_file = ZipFile(os.path.join(root, filename))
for text_file in zip_file.infolist():
if text_file.filename.endswith('Bezirke.csv'):
df = pd.read_csv(zip_file.open(text_file.filename),
delimiter=';',
header=0,
index_col=['Timestamp'],
parse_dates=['Timestamp']
)
if not flag:
df_master = df
flag = True
else:
df_master = pd.concat([df_master, df])
#sort index field Timestamp
df_master.sort_index(inplace=True)
#print master dataframe info
print(df_master.info())
#prepare date to export to csv
frame = df_master
#export to csv
try:
frame.to_csv( "combined_zip_Bezirke.csv", encoding='utf-8-sig')
print("Export to CSV Successful")
except:
print("Export to CSV Failed")
解决方案
您忘记包含路径 - os.walk返回的文件名只是文件名,没有指向该文件名的路径。你需要的是:
zip_file = ZipFile(os.path.join(root, filename))
此外,您在 for 循环中的缩进是错误的,它必须是:
for text_file in zip_file.infolist():
if text_file.filename.endswith('Bezirke.csv'):
df = pd.read_csv(zip_file.open(text_file.filename),
delimiter=';',
header=0,
index_col=['Timestamp'],
parse_dates=['Timestamp']
)
if not flag:
df_master = df
flag = True
else:
df_master = pd.concat([df_master, df])
推荐阅读
- reactjs - 突出显示所选项目 onPress
- r - 将 scale_colour 和 scale_fill 结合在同一个函数中
- react-native - React Native:错误[TypeError:null不是对象(评估'WebRTCModule.peerConnectionInit')]
- python - 试图缩短我的 python 代码。有人有想法吗?
- vba - VBA Pivot 过滤器在每个过滤器项上重新计算表 - 如何避免这种情况?
- mysql - 如何获得取决于数据馈送的不同值的特定值?
- ios - 如何从 UITableViewCell 中加载 UITableView?
- ruby-on-rails - 将 ActiveStorage 资产从一个 S3 存储桶迁移到另一个
- ios - UIActivityViewController 将图像保存到照片库,但使用 false 调用其完成处理程序
- r - 累计值 CI