[英]Loop through csv, write new values to csv
介绍
自从我过去两个月使用 scrapy 后,我休息一下并开始使用 python 学习文本格式化。我从我的网络爬虫中获取了一些数据,这些数据存储在 a.csvFile 中,如下所示:
我的.csv文件
SKU
"
Article nr. : 560821800 / D26 x H10 cm
"
"
Article nr. : 560828100 / D14 x H11 cm
"
"
Article nr. : 560821400 / D13 x H10 cm
"
"
Article nr. : 560821900 / L17 x W17 x H14
"
"
Article nr. : 560828900 / L17 x W17 x H14
"
"
Article nr. : 560821600 / D16 x H13 cm
"
"
Article nr. : 560828300 / D16 x H13 cm
"
"
Article nr. : 560827900 / D13 x H10 cm
"
"
Article nr. : 560829000 / L17 x W17 x H14
"
有太多的空格和其他我不想拥有的东西,所以我读到了“RegularExpression”。
现在我玩了一下,设法删除了所有空格和其他不需要的数字,所以我只有 fe 560821800
代表特定产品的 ID。
现在我打开 .csv 文件,编辑值并尝试将其写入新的 .csv 文件,我将其命名为 output。
“输出”文件仅包含一列,我想将其称为“SKU”。
代码
import csv
import re
with open(r'C:\Users\y.y\OneDrive - company name\Python3_Textformatierung\sku.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for row in csv_reader:
sku = row.pop()
sku = re.sub(r'[\s\t\n]+|(\.)+|(\:)', '', sku)
sku = sku.replace('Articlenr', '')
print(sku)#string splitted to ['560827900', 'D13xH10cm']
string_to_list = sku.split('/')#splits string to list
print(string_to_list)
sku_string = string_to_list.pop(0)
print(sku_string)#only value of sku remains
运行此代码后,我得到以下output :
SKU
['SKU']
SKU
560821800/D26xH10cm
['560821800', 'D26xH10cm']
560821800
560828100/D14xH11cm
['560828100', 'D14xH11cm']
560828100
560821400/D13xH10cm
['560821400', 'D13xH10cm']
560821400
560821900/L17xW17xH14
['560821900', 'L17xW17xH14']
560821900
560828900/L17xW17xH14
['560828900', 'L17xW17xH14']
560828900
560821600/D16xH13cm
['560821600', 'D16xH13cm']
560821600
560828300/D16xH13cm
['560828300', 'D16xH13cm']
560828300
560827900/D13xH10cm
['560827900', 'D13xH10cm']
560827900
560829000/L17xW17xH14
['560829000', 'L17xW17xH14']
560829000
我的问题我想收集sku_string
的每个值并将它们写入 output.csv 文件,但只有字段名被传递到新文件。
我用以下代码尝试了这个任务:
#write data to csv with fieldname['SKU']
with open(r'C:\Path\to\Output.csv', 'w') as csv_file:
fieldname = ['SKU']
csv_writer = csv.DictWriter(csv_file, fieldnames=fieldname, delimiter=',')
csv_writer.writeheader()
print(sku_string)
for s in row:
csv_writer.writerow(['SKU', sku_string])
我也认识到,我使用的最后一个打印语句(仅用于测试)只有一个值,我错过了什么?
我是真正的初学者,我在 stackoverflow 上阅读了很多关于循环的信息,但我无法将解决方案转移到我的问题上,因为其中大多数对于我的实际技能水平来说太高了
更新
我修改了我的代码,但它仍然只将最后一个 output 写入 Output.csv 文件._。
import csv
import re
with open(r'Path\to\sku.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for row in csv_reader:
row = row.pop()#convert from list to str
row = row.split('/')#convert str to list with 2 elements, splitted by '/'
sku_string = row.pop(0)#string with Articlenr + SKU
sku_string = sku_string.split(':')
only_sku = sku_string.pop()
#every string contains only sku now
print(only_sku)
with open(r'C:\Path\to\Output.csv', 'w') as csv_file:
fieldname = ['SKU']
writer = csv.DictWriter(csv_file, delimiter=',', fieldnames=fieldname)
writer.writeheader()
for x in only_sku:
writer.writerow({'SKU' : only_sku})
Output.csv
我采取了一些不同的方法,并将您的.csv
文件更改为.txt
文件,老实说,无论您拥有什么,它看起来都不像 CSV 结构。
这是我想出的:
import csv
with open("sample.txt") as f:
lines = f.readlines()
parsed_lines = [l for l in [l.strip() for l in lines] if l != '"' and l != "SKU"]
parsed_lines = [l.replace("Article nr. : ", "").split("/") for l in parsed_lines]
with open("output.csv", "w") as output:
w = csv.writer(output)
w.writerow(["Article nr.", "Dimensions"])
w.writerows(parsed_lines)
Output:
Article nr. Dimensions
------------- ---------------
560821800 D26 x H10 cm
560828100 D14 x H11 cm
560821400 D13 x H10 cm
560821900 L17 x W17 x H14
560828900 L17 x W17 x H14
560821600 D16 x H13 cm
560828300 D16 x H13 cm
560827900 D13 x H10 cm
560829000 L17 x W17 x H14
或者在.csv
文件中:
每行的新值将写入for row in csv_reader:
内的only_sku
字符串。 如果你想在循环外访问这些值,你需要将它们收集到某个地方,例如通过 append 将它们收集到一个列表中。
所以你的阅读循环变成:
all_sku = []
with open(r'Path\to\sku.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for row in csv_reader:
row = row.pop()#convert from list to str
row = row.split('/')#convert str to list with 2 elements, splitted by '/'
sku_string = row.pop(0)#string with Articlenr + SKU
sku_string = sku_string.split(':')
only_sku = sku_string.pop().strip()
#every string contains only sku now
print(only_sku)
all_sku.append(only_sku)
请注意我们如何使用all_sku.append()
将我们读取的最新值添加到我们的所有值列表中。 我们还想从我们的价值观中去除前导和尾随的空白。
然后你可以像这样写在另一个循环中:
with open(r'C:\Path\to\Output.csv', 'w') as csv_file:
fieldname = ['SKU']
writer = csv.DictWriter(csv_file, delimiter=',', fieldnames=fieldname)
writer.writeheader()
for x in all_sku:
writer.writerow({'SKU' : x})
请注意,我们现在遍历all_sku
并写入该列表的每个元素。
现在,如果您希望将尺寸也写入新的 csv 文件,您还需要跟踪该值。 与其像我们之前那样创建一个字符串列表,不如创建一个我们稍后要传递给writer.writerow()
的dict
列表更容易。 所以我们有:
all_rows = []
with open(r'Path\to\sku.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for row in csv_reader:
row = row.pop() #convert from list to str
row = row.split('/')#convert str to list with 2 elements, splitted by '/'
sku_string = row[0]
dims_string = row[1].strip()
sku_string = sku_string.split(':')
only_sku = sku_string[1].strip()
all_sku.append({'SKU': only_sku, 'Dimensions': dims_string})
然后这样写:
with open(r'C:\Path\to\Output.csv', 'w') as csv_file:
fieldname = ['SKU', 'Dimensions']
writer = csv.DictWriter(csv_file, delimiter=',', fieldnames=fieldname)
writer.writeheader()
for row_dict in all_rows:
writer.writerow(row_dict)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.