有人可以帮我找出我的代码有什么问题吗?

问题描述 投票:0回答:1
import os
import zipfile
import pandas as pd
Function to find ZIP files with the relevant keywords (VTE, CLI, ART)
def find_zip_files(month_folder_path):
zip_files = {"vte": None, "cli": None, "art": None}
List all files in the month folder
for filename in os.listdir(month_folder_path):
if "VTE" in filename and filename.endswith('.zip'):
zip_files["vte"] = os.path.join(month_folder_path, filename)
elif "CLI" in filename and filename.endswith('.zip'):
zip_files["cli"] = os.path.join(month_folder_path, filename)
elif "ART" in filename and filename.endswith('.zip'):
zip_files["art"] = os.path.join(month_folder_path, filename)
return zip_files
Data_extraction_function
def extract_csv_from_zip(zip_path):
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
for file in zip_ref.namelist():
if file.endswith('.csv'): # Look for CSV files in the ZIP
with zip_ref.open(file) as csvfile:
return pd.read_csv(csvfile)
return None
Merge_function 
def merge_data(vte_df, cli_df, art_df):
if vte_df is not None and cli_df is not None:
merged_vte_cli = pd.merge(vte_df, cli_df, on='clicod', how='outer')
else:
raise ValueError("VTE or CLI data missing, cannot merge.")
if art_df is not None:
merged_final = pd.merge(merged_vte_cli, art_df, on='artcod', how='outer')
else:
merged_final = merged_vte_cli
return merged_final
Main loop iterate through years and months
def process_folders(base_path, years, max_months_per_year):
for year in years:
year_folder_path = os.path.join(base_path, year)
max_month = max_months_per_year.get(year, 12)
for month in range(1, max_month + 1):
month_folder = f'M{month:02d}' 
month_folder_path = os.path.join(year_folder_path, month_folder)
if os.path.exists(month_folder_path):
Find ZIP files in the current month folder
zip_files = find_zip_files(month_folder_path)
Extract CSV files from the ZIPs
vte_df = extract_csv_from_zip(zip_files["vte"]) if zip_files["vte"] else None
cli_df = extract_csv_from_zip(zip_files["cli"]) if zip_files["cli"] else None
art_df = extract_csv_from_zip(zip_files["art"]) if zip_files["art"] else None
If VTE or CLI files are missing, skip the month
if vte_df is None or cli_df is None:
print(f"Skipping {month_folder} in {year} due to missing VTE or CLI data.")
continue
Merge the data
merged_data = merge_data(vte_df, cli_df, art_df)
Output the merged data to a CSV file
output_file = f'merged_data_{year}_{month_folder}.csv'
merged_data.to_csv(output_file, index=False)
print(f"Merged data for {year} {month_folder} saved to {output_file}.")
else:
print(f"{month_folder_path} does not exist. Skipping...")
Define the base path and years
base_path = r"C:\Users\DATA\Wholesalers"
years = ['Y2023', 'Y2024']
max_months_per_year = {'Y2023':12,'Y2024':8}
Process all folders
process_folders(base_path, years, max_months_per_year)`

背景 我有一个包含两个文件夹(Y2023、Y2024)的目录,每个文件夹都包含月份文件夹(M01、M02 等),并且在每个月份文件夹中,都有名称带有关键字(VTE、CLI、ART)的 ZIP 文件夹这些 zip 文件夹均包含一个同名的 CSV 文件。 我需要从 ZIP 文件夹中提取简历,然后合并客户端代码上的 VTE 和 CLI 数据,然后将此结果与每个月文件夹的文章代码上的 ART 数据合并,然后对所有月份文件夹重复,并对所有年份执行相同操作然后按 QT 销售文件夹进行分组。 这里的目标是拥有一个数据框,其中包含从与客户代码匹配的 VTE_files 到 client_file 的所有销售,以收集客户信息或通过文章代码到 Article_file 收集文章信息。 VTE 文件包含商品代码、客户代码和销售数量。 数据框还应包括每种产品每月销售的总量。 Wholesaler 文件夹有 Y2023 和 Y2024 两个文件夹。每个文件夹在文件夹 M01 / M02 等中都有每月数据,如下所示: 问题 我的代码会跳过所有文件,就好像它们不是空的一样。 我尝试了上面的代码,它显示一条消息,表明所有文件都被跳过(对于所有文件):在输出下方: 由于缺少 VTE 或 CLI 数据,跳过 2023 年的 M01。 由于缺少 VTE 或 CLI 数据,跳过 2023 年的 M02。 由于缺少 VTE 或 CLI 数据,跳过 2023 年的 M03。 由于缺少 VTE 或 CLI 数据,跳过 2023 年的 M04。 由于缺少 VTE 或 CLI 数据,跳过 2023 年的 M05。 由于缺少 VTE 或 CLI 数据,跳过 2023 年的 M06。 由于缺少 VTE 或 CLI 数据,跳过 2023 年的 M07。 由于缺少 VTE 或 CLI 数据,跳过 2023 年的 M08。 由于缺少 VTE 或 CLI 数据,跳过 2023 年的 M09。 由于缺少 VTE 或 CLI 数据,在 2023 年跳过 M10。 由于缺少 VTE 或 CLI 数据,在 2023 年跳过 M11。 由于缺少 VTE 或 CLI 数据,在 2023 年跳过 M12。 由于缺少 VTE 或 CLI 数据,跳过 2024 年的 M01。 由于缺少 VTE 或 CLI 数据,跳过 2024 年的 M02。 由于缺少 VTE 或 CLI 数据,跳过 2024 年的 M03。 由于缺少 VTE 或 CLI 数据,跳过 2024 年的 M04。 由于缺少 VTE 或 CLI 数据,跳过 2024 年的 M05。 由于缺少 VTE 或 CLI 数据,跳过 2024 年的 M06。 由于缺少 VTE 或 CLI 数据,跳过 2024 年的 M07。 由于缺少 VTE 或 CLI 数据,跳过 2024 年的 M08。

python pandas merge data-analysis
1个回答
0
投票

问题似乎在于 find_zip_files 函数的结构。它使用每个键(vte、cli、art)的 None 值初始化 zip_files,如果在文件夹中找不到符合这些条件之一的文件,则它仍为 None。稍后在代码中,您将检查 zip_files["vte"]、zip_files["cli"] 或 zip_files["art"] 是否为 None,以决定是否跳过该月的处理。

鉴于您的代码正在跳过所有文件,这表明它没有找到符合预期条件(“VTE”、“CLI”、“ART”)的文件。发生这种情况的原因有多种:

区分大小写:Python 字符串操作区分大小写。如果目录中的文件名不完全是“VTE”、“CLI”、“ART”(例如,它们是小写或混合大小写),它们将与 find_zip_files 中的检查不匹配。

文件扩展名:函数 find_zip_files 检查以 .zip 结尾的文件名。如果您的文件具有不同的扩展名或没有扩展名,它们将无法被识别。

© www.soinside.com 2019 - 2024. All rights reserved.