Python代码未生成指定output.csv输出文件的技术求助
问题排查与修复方案
嘿,我仔细看了你的代码,找到了几个导致output.csv无法生成的核心问题,咱们一步步来解决:
1. 最关键的问题:文件列表未正确初始化
你把filelist初始化成了空字符串"",这意味着后面的for filename in filelist循环根本不会执行——字符串遍历是按字符来的,但空字符串没有任何字符,所以代码直接跳过了所有文件处理和写入逻辑,自然不会生成输出文件。
你需要把它改成获取指定目录下的文件列表:
filelist = os.listdir(indir) # 如果只需要处理txt文件,可以加过滤: # filelist = [f for f in os.listdir(indir) if f.endswith('.txt')]
2. 硬编码文件名导致逻辑错误
循环里你一直读取固定的SYB_M_20171001_20171031.txt,而不是遍历filelist里的每个文件。而且用os.chdir(indir)虽然能切换目录,但更稳妥的方式是直接拼接文件路径,避免改变当前工作目录带来的潜在问题:
df = pd.read_csv(os.path.join(indir, filename), header=None, encoding='utf-8', sep='\t', names=colnames, skiprows=1, usecols=['Units Sold', 'Dealer Price', 'End Consumer Country', 'Currency Code'])
3. 输出逻辑可能导致文件覆盖(或未汇总)
当前代码把df.to_csv放在循环内部,每次处理一个文件就会覆盖output.csv。如果你的目标是汇总所有文件的数据到一个output.csv,应该先把每个文件的处理结果存入dflist,最后统一合并后输出;如果是要每个文件生成单独的输出,那要修改文件名避免覆盖。
比如汇总所有文件的写法:
# 把df.to_csv移出循环,放在最后 dflist.append(df) # 注意这里存的是处理后的df,不是文件名 # 循环结束后合并所有数据并输出 final_df = pd.concat(dflist, ignore_index=True) final_df.to_csv(os.path.join(outfile, "output.csv"), index=None)
4. 额外保障:检查输出目录是否存在
如果输出目录不存在,pandas写入文件会报错,所以最好提前创建目录:
os.makedirs(outfile, exist_ok=True) # exist_ok=True表示目录已存在时不报错
修改后的完整代码
import os import pandas as pd def summarise(indir, outfile): # 创建输出目录(如果不存在) os.makedirs(outfile, exist_ok=True) # 获取目录下的所有txt文件 filelist = [f for f in os.listdir(indir) if f.endswith('.txt')] dflist = [] colnames = ["DSP Code", "Report Date", "Initial Date", "End Date", "Transaction Type", "Sale Type", "Distribution Channel", "Products Origin ID", "Product ID", "Artist", "Title", "Units Sold", "Retail Price", "Dealer Price", "Additional Revenue", "Warner Share", "Entity to be billed", "E retailer name", "E retailer Country", "End Consumer Country", "Price Code", "Currency Code"] for filename in filelist: print(f"Processing {filename}...") # 拼接完整文件路径,避免切换目录 file_path = os.path.join(indir, filename) df = pd.read_csv(file_path, header=None, encoding='utf-8', sep='\t', names=colnames, skiprows=1, usecols=['Units Sold', 'Dealer Price', 'End Consumer Country', 'Currency Code']) # 计算单文件收入总和 df['Sum of Revenue'] = df['Units Sold'] * df['Dealer Price'] # 计算单文件总计 d = {'Sum of Revenue': 'Total Revenue', 'Units Sold': 'Total Units'} for col, newcol in d.items(): df.loc[df.index[0], newcol] = df[col].sum() # 按国家汇总销量 s = df.groupby('End Consumer Country')['Units Sold'].sum().to_frame().T.add_suffix(' Total') s.index = [df.index[0]] df = pd.concat([df, s], axis=1, sort=False) # 将处理后的DataFrame加入列表 dflist.append(df) # 合并所有文件的数据并输出 if dflist: final_df = pd.concat(dflist, ignore_index=True) final_output_path = os.path.join(outfile, "output.csv") final_df.to_csv(final_output_path, index=None) print(f"Successfully generated {final_output_path}") else: print("No txt files found in the input directory.") # 调用函数 summarise(r"O:\James Upson\Sound Track Your Brand Testing\SYB Test", r"O:\James Upson\Sound Track Your Brand Testing\SYB Test Formatted")
这样修改后,代码应该能正常生成output.csv文件了。如果还有问题,可以检查输入目录下是否有txt文件,以及输出目录的权限是否正常。
内容的提问来源于stack exchange,提问作者James Upson
相关产品推荐
相关产品推荐

