当我在脚本1print(test.dataScraper(merchantID, productID))
中运行此命令时,它会打印多个值。
而当我导出到。csv
df = pd.DataFrame(script2.dataScraper(merchantID, productID))
df.to_csv("plsWork.csv")
它只打印最后一个值,而不是全部。
脚本1
import script2
with open('productID.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file)
next(csv_reader)
for line in csv_reader:
merchantID = (line[2])
productID = (line[4])
if len(productID) == 0:
break
df = pd.DataFrame(script2.dataScraper(merchantID, productID))
df.to_csv("plsWork.csv")
#print(test.dataScraper(merchantID, productID))
脚本2
def dataScraper(merchantID, productID):
## Product Information
data_dict['Product ID'] = data['data']['id']
data_dict['Product Name'] = data['data']['name']
data_dict['Product Size'] = bottleSize
data_dict['Product Option ID'] = optionID
data_dict['Quantity In Stock'] = availableQuantity
master_list.append(data_dict)
if size == 0:
break
return(master_list)
解析你的代码有点困难,因为它不是一个最小的可重复的例子,但是你有一些明显的问题:
dataScraper
接受两个变量,并且不使用它们。相反,您依赖于一些不是函数的局部变量。dataScraper
连续覆盖非局部变量data_dict
dataScraper
返回一个None
值或现在修改的数组。- 但是你的主要问题可能是你正在为
for line in csv_reader
节的每个循环写to_csv
。如果你的master_list
在每个循环中被重新创建,那么它只会有你在其中处理的最后一个值,因为to_csv
函数不是追加的,它是覆盖的。
为了至少隔离您的问题,您应该让您的函数只使用局部变量。比如:
def process_file(file_to_read: str, output_file: str) -> None:
with open(file_to_read, 'r') as csv_file:
csv_reader = csv.reader(csv_file)
next(csv_reader) # Skip column headers
processed_dicts = [ scrape_data(line[2], line[4]) for line in csv_reader ]
pprint(processed_dict) # Just to prove to ourselves it's correct, comment out for prod
df = pd.DataFrame(processed_dicts)
df.t0_csv(output_file)
def scrape_data(merchant_id, product_id) -> dict:
data = ...? # Either this should be passed in as a param or fetched from somewhere.
processed_dict = {
'Product Id': data['data']['id'],
... # all your other things
}
return processed_dict
正如您所看到的,data
所在的位置有一个大洞,但是这个结构应该可以约束您的问题。记住:全局变量不是你的朋友!
(另外,作为题外话,您应该真正使用习惯的Python蛇形大小写作为变量名,即scrape_data
而不是scrapeData
。)