2017-10-11 202 views
-1

我是Python語言的新手,我面臨的是一個小小的挑戰,到目前爲止瞭解它。 我收到一個csv文件,大約30-40列,5-50行,每個單元格中有各種細節。 csv的第一行有每列的標題,第二行有我的項目值。 我想要做的是創建一個python腳本,它將讀取csv文件,並且每次都執行以下操作: 在實際的第一項行之後添加一行(字面意思是在第二行之後,導致第一行是標題),並在新的第三行中包含與上面相同的信息,只有一個區別。在「item_subtotal」列中,我想添加「折扣總額」列中的值。 所有波紋管行應保持原樣,並將此修改後的csv保存爲新文件,並在文件名中添加單詞「編輯」。 我真的可以使用一些幫助,因爲到目前爲止我只設法打開一個python腳本即時通訊開發csv文件,但我不能夠到目前爲止添加上述行的內容到新創建的行並替換該特定值。 期待任何幫助。 謝謝如何在python中編輯csv並在第二行之後添加一行,除了1之外的所有列中都具有相同的值

這裏我附加CSV的一些值爲了保護隱私的原因。

ORDER_ID,ORDER_NUMBER,日期,狀態,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_last_name,billing_company,billing_email,billing_phone,billing_address_1,billing_address_2, billing_postcode,billing_city,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_quantity,item_subtotal,item_subtotal_tax,ITEM_TOTAL,item_total_tax,item_refunded,item_refunded_qty, item_meta,shipping_items,fee_items,tax_items,coupon_items,order_notes,download_permissions_granted,admin_custom_order_field:customer_type_5 15001_TE ST_2 ,,「2017-10-09 18:53:12」,處理中,0,0.00,0.00,0.00,5.36,7.06,33.60,0.00,歐元,PayoneCw_PayPal,「0,00」,0,姓名, ,name.surname @ gmail.com,,「address 1」,41541_TEST,location ,, DE,name,姓氏,地址,01245212,14521,location ,, DE ,,, 1328,302,「product title」, 103,1,35.29,6.71,28.24,5.36,0.00,0 ,, 「ID:1329 | method_id:free_shipping:3 | method_title:0,00 |總計:0.00」 ,, ID:1330 | rate_id:1 |代碼: DE-MWST-1 | title:MwSt | total:5.36 | compound:,「id:1331 | code:#getgreengent | amount:7.06 | description:Launchcoupon for friends」,「text string」,1,

+2

發佈輸入文件內容和預期結果 – RomanPerekhrest

+0

牆上的文本,沒有輸入數據的例子,沒有預期的輸出。 Downvoted。請閱讀:https://stackoverflow.com/help/how-to-ask –

+0

嗨安東, 我編輯了我的文章並添加了示例數據。對不起我的菜鳥錯誤。請遵循指南。 –

回答

0

您也可以使用熊貓從這樣的CSV操作數據:

import pandas 
import copy 

閱讀CSV文件轉換成大熊貓數據幀:

df = pandas.read_csv(filename) 

製作的第一行的deepcopy的數據並將折扣總額添加到項目小計中:

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) 

我希望這有助於!熊貓非常適合乾淨地處理海量數據,但對於您要做的事情可能會過度。然後,也許不是。這將有助於查看示例數據文件。

+0

謝謝MacKenzie, I'將在明天發表評論和我的結果。 我沒有使用熊貓這麼多,但是,似乎我需要做更多的關於這個話題的學習和練習。 –

+0

Hello L. Mackenzie 非常感謝您的回答和幫助!真的,我不會寫這段代碼的時間,因爲我沒有那種熊貓經驗,但似乎像一個夢幻般的圖書館,我已經進一步研究。 現在,我測試了你的代碼,但我得到以下錯誤:KeyError:'標籤[1]不在[index]' 我編輯了我的帖子並添加了CSV用於示例目的。 當我在Excel中打開CSV時,csv內容在行中很好地呈現,但是當我用Notepad ++打開它時,沒有行。 那麼現在如何改變這個值? 再次感謝您 –

+0

Notepad ++將csv文件視爲一個簡單的文本文件,但Excel將它視爲csv(逗號分隔值),因此它將值分隔爲不同的列。這就是爲什麼它在Excel和Notepad ++中看起來不同。至於你得到的KeyError,如果沒有完整的Traceback和你使用的csv文件運行的代碼,就很難進行調試。 –

0

The第一步是將該.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] 

現在,你可以簡單地複製列表[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] 

希望這會幫助你!

+0

你好基思, 我跟着你的建議,雖然它打印出控制檯的列表中,我得到以下錯誤:TypeError:描述符'插入'需要'列表'對象,但收到'str' 我已經嘗試將該整數更改爲其他值,但仍未想出如何正確執行此操作。 非常感謝您的協助。 希望不久,我也能夠幫助別人! –

+0

更多的東西, 如果我不添加: DEF listTemp(列表): 的 listTemp =列表之前[1] 等。 我得到的錯誤:類型錯誤:「類型」對象未標化的 –

+0

爲了澄清,我使用的Python 2.7 ...我能夠得到代碼工作在一個隨機測試.csv文件。當然,我並沒有真正使用'list'作爲變量名。此外,您需要使用'import copy'並使用'listTemp = copy.deepcopy(ilist [1])'而不是現有的'ilist [1]'的實際副本 –

相關問題