簡體   English   中英

如何在python中編輯csv並在第二行后添加一行,該行在除1之外的所有列中都具有相同的值

[英]how to edit a csv in python and add one row after the 2nd row that will have the same values in all columns except 1

我是 Python 語言的新手,我面臨着一個小挑戰,到目前為止我還沒有弄清楚。 我收到一個 csv 文件,其中包含大約 30-40 列和 5-50 行,每個單元格中都有各種詳細信息。 csv 的第一行有每一列的標題,第二行我有項目值。 我想要做的是創建一個 python 腳本,它將讀取 csv 文件,每次執行以下操作:在實際的第一個項目行之后添加一行,(字面意思是在第二行之后,因為第一行是標題),並在新的第三行中包含與上述相同的信息,只有一個不同。 在“item_subtotal”列中,我想添加“discount total”列中的值。 所有波紋管行應保持原樣,並將此修改后的 csv 保存為新文件,並在文件名中添加“已編輯”一詞。 我真的可以使用一些幫助,因為到目前為止我只設法使用正在開發的 python 腳本打開 csv 文件,但到目前為止我無法將上述行的內容添加到新創建的行並替換該特定值. 期待任何幫助。 謝謝

在這里,我附加了一些出於隱私原因而更改的值的 CSV。

order_id,order_number,date,status,shipping_total,shipping_tax_total,fee_total,fee_tax_total,tax_total,discount_total,order_total,refunded_total,order_currency,payment_method,shipping_method,customer_id,billing_first_name,billing_first_name,billing_billing_name,billing_billing_address,billing_address,billing_addressany,billing_address,billing_addressany,billing_addressany,billing_addressany1 billing_state,billing_country,shipping_first_name,shipping_last_name,shipping_address_1,shipping_address_2,shipping_postcode,shipping_city,shipping_state,shipping_country,shipping_company,customer_note,item_id,item_product_id,item_name,item_sku,item_sku,item_sku,item_fund_tax,item_subtotality,item_sku,item_fund_tax,item_subtotality,item_fund_item_tax fee_items,tax_items,coupon_items,order_notes,download_permissions_granted,admin_custom_order_field:customer_type_5 15001_TEST_2,"2017-10-09 18:53:12",processing,0,0.00,0.00,0,6.030Cpayone.0.00,0.00.0,6.0030060PayPal ,"0,00",0,name,surname,,name.surname@gmail.com,0123456789, "地址 1",,,41541_TEST,location,,DE,name,surname,address,01245212,14521,location,,DE,,,1328,302,"產品名稱",103,1,35.29,6.71,28.24,5.36 ,0.00,0,,"id:1329|method_id:free_shipping:3|method_title:0,00|total:0.00",,id:1330|rate_id:1|code:DE-MWST-1|title:MwSt|total :5.36|compound:,"id:1331|code:#getgreengent|amount:7.06|description:Launchcoupon for friends","text string",1,

第一步是將 .csv 轉換為更易於使用的文件。 幸運的是,python 具有 'csv' 模塊,它可以輕松地將您的 .csv 文件轉換為更好的列表列表。 下面將為您提供一種將 .csv 轉換為列表列表並將修改后的數據轉換回 .csv 文件的方法。

import csv
import copy

def csv2list(ifile):
    """
    ifile = the path of the csv to be converted into a list of lists
    """
    f = open(ifile,'rb')
    olist=[]
    c = csv.reader(f, dialect='excel')
    for line in c:
        olist.append(line) #and update the outer array
    f.close
    return olist

#------------------------------------------------------------------------------
def list2csv(ilist,ofile):
    """
    ilist =  the list of lists to be converted
    ofile = the output path for your csv file
    """
    with open(ofile, 'wb') as csvfile:
        csvwriter = csv.writer(csvfile, delimiter=',',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
        [csvwriter.writerow(x) for x in ilist]

現在,您可以簡單地復制 list[1] 並使用以下方法更改適當的元素以反映您的總和值:

listTemp = copy.deepcopy(ilist[1])
listTemp[n] = listTemp[n] + listTemp[n-x]

ilist.insert(2,listTemp)

至於如何更改文件名,只需使用:

import os

newFileName = os.path.splitext(oldFileName)[0] + "edited" + os.path.splitext(oldFileName)[1] 

希望這會幫助你!

您還可以使用 pandas 來操作來自 csv 的數據,如下所示:

import pandas
import copy

將 csv 文件讀入 Pandas 數據幀:

df = pandas.read_csv(filename)

對第一行數據進行深度復制,並將折扣總額添加到項目小計中:

new_row = copy.deepcopy(df.loc[1])
new_row['item_subtotal'] += new_row['discount total']

將前 2 行與新行連接起來,然后是之后的所有內容:

df = pandas.concat([df.loc[:1], new_row, df.loc[2:]], ignore_index=True)

更改文件名並寫出新的 csv 文件:

filename = filename.strip('.csv') + 'edited.csv'
df.to_csv(filename)

我希望這有幫助! Pandas 非常適合干凈地處理大量數據,但對於您正在嘗試做的事情來說可能有點過頭了。 再說一次,也許不是。 查看示例數據文件會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM