求助:无法遍历当前目录所有JSON文件提取productId与userProfileId到CSV
解决遍历JSON文件并提取数据的问题
我看了你的代码,问题主要出在os.walk的使用方式,还有几个小细节需要调整,下面一步步给你说清楚:
主要问题分析
os.walk遍历逻辑错误:
os.walk返回的是一个包含(root, dirs, files)的元组,分别代表当前遍历的目录路径、子目录列表、文件列表。你现在的循环for files in os.walk(".")会把这三个元素依次当成"files"变量处理,之后嵌套的循环完全偏离了目标,自然没法正确遍历所有JSON文件。CSV文件写入模式错误:
你用open('user-item.csv','w')每次打开文件都会清空之前的内容,最后只会保留最后一个JSON文件的数据,应该改用追加模式'a',或者先一次性写入表头,再逐个文件追加数据。productId提取错误:
你写的products_data[0]['productId']只会取每个JSON里第一个产品的ID,而循环for item in products_data本来就是要遍历每个产品,应该用item['productId']来获取当前产品的ID。导入语句语法错误:
开头的import json import csv不符合Python语法,要分成两行写。
修正后的代码
import json import csv import os # 注意键名和提取的字段对应,统一命名避免混淆 KEYS = ['userProfileId', 'productId'] # 先写入CSV表头,避免重复写入 with open('user-item.csv', 'w', newline='') as dataFile: newFileWriter = csv.writer(dataFile) newFileWriter.writerow(KEYS) # 正确遍历当前目录及子目录下的所有文件 for root, dirs, files in os.walk("."): for filename in files: if filename.endswith(".json"): # 拼接完整文件路径,避免子目录文件找不到 file_path = os.path.join(root, filename) print(f"Processing file: {file_path}") with open(file_path) as json_data: order_parsed = json.load(json_data) products_data = order_parsed['items'] user_data = order_parsed['clientProfileData'] userId = user_data["userProfileId"] # 遍历每个产品,写入对应数据 with open('user-item.csv', 'a', newline='') as dataFile: newFileWriter = csv.writer(dataFile) for item in products_data: productId = item['productId'] print(f"User ID: {userId}, Product ID: {productId}") newFileWriter.writerow([userId, productId])
额外说明
- 用
os.path.join(root, filename)拼接完整路径,这样即使JSON文件在子目录里也能正确读取; - 把表头单独写一次,避免每个文件都重复写入表头;
- 追加模式
'a'保证每个JSON文件的数据都会被添加到CSV末尾,不会被之前的内容覆盖; - 修正了productId的提取逻辑,现在每个产品的ID都会被正确获取并写入。
内容的提问来源于stack exchange,提问作者binarymonk
相关产品推荐
相关产品推荐

