繁体   English   中英

循环csv,将新值写入csv

[英]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

我采取了一些不同的方法,并将您的.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM