循环遍历文件列表向对应DataFrame写入数据失败的解决方法
循环填充对应DataFrame的解决方法
你的代码问题核心是:df.append()会返回新的DataFrame对象,循环里的df = df.append(...)只是把新对象赋值给临时变量,并没有修改原列表dfs里的df1、df2,所以原DataFrame始终为空。
下面给两种简单的解决方式,都能满足你“每个文件对应一个填充好的DataFrame”的需求:
方法一:直接生成新的DataFrame列表(推荐)
不需要提前初始化df1、df2,直接在循环中处理每个文件并生成对应DataFrame,最后收集到列表里,逻辑更清晰:
import pandas as pd filenames = ['file1.txt', 'file2.txt'] columns = ['a', 'b', 'c'] dfs = [] for name in filenames: # 初始化当前文件的空DataFrame current_df = pd.DataFrame(columns=columns) # 用with语句自动管理文件关闭,更安全 with open(name, 'r') as info: # 这里替换成你的数据提取逻辑,比如从文件中找到目标值 # 示例:假设提取到的字典格式数据如下 extracted_data = {'a': 1, 'b': 2, 'c': 3} # 注意:Pandas 2.0+已弃用append,推荐用pd.concat替代 current_df = pd.concat([current_df, pd.DataFrame([extracted_data])], ignore_index=True) dfs.append(current_df) # 按需取出对应DataFrame df1 = dfs[0] df2 = dfs[1]
方法二:通过索引修改原列表
如果一定要保留提前初始化的DataFrame列表,可以用enumerate拿到索引,直接修改列表中的元素:
import pandas as pd filenames = ['file1.txt', 'file2.txt'] columns = ['a', 'b', 'c'] # 提前初始化空DataFrame列表 dfs = [pd.DataFrame(columns=columns), pd.DataFrame(columns=columns)] for idx, name in enumerate(filenames): with open(name, 'r') as info: extracted_data = {'a': 1, 'b': 2, 'c': 3} # 通过索引直接更新列表中的DataFrame dfs[idx] = pd.concat([dfs[idx], pd.DataFrame([extracted_data])], ignore_index=True) df1 = dfs[0] df2 = dfs[1]
注意事项
- 优先用
with语句打开文件,避免忘记关闭文件导致资源泄漏; - 如果你用的是Pandas 2.0及以上版本,
append方法已经被弃用,用pd.concat或者直接创建新的DataFrame行来拼接是更稳妥的方式。
内容的提问来源于stack exchange,提问作者Alexander_Zozulia
相关产品推荐
相关产品推荐

