2017-10-11 6 views
-1

私はPython言語では新しく、私はできなかった小さな課題に直面していますこれまでのところそれを理解する。 約30〜40列と5〜50行のcsvファイルを受信し、各セルにさまざまな詳細が表示されます。 csvの第1行には各列のタイトルがあり、第2行には項目値があります。 私がしたいのは、csvファイルを読み込み、次の操作を行うたびにpythonスクリプトを作成することです。 実際の1番目の項目行の後に行を追加します(2行目以降は、 )、そしてその新しい3行目に、上記のような同じ情報を1つの違いだけで含むようにします。列 "item_subtotal"で "割引合計"列の値を追加したいと思います。 迷惑行はそのまま残り、この変更されたCSVをファイル名に "edited"という単語が追加された新しいファイルとして保存する必要があります。 これまでのところ、私はpythonスクリプトを使ってcsvファイルを開いていただけですが、これまでに作成した行に上記の行の内容を追加してその特定のものを置き換えることができなかったので、値。 助けを楽しみにしています。 ありがとうございますPythonでcsvを編集し、2番目の行の後に1行を追加して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、EUR、PayoneCw_PayPal、 "0,00"、0、名前、姓、 、名前、姓、住所、01245212,14521、場所、DE ,,, 1328,302、 "製品タイトル" 1031,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 | code: DE-MWST-1 |タイトル:MWST |合計:5.36 |化合物:、 "ID:1331 |コード:#getgreengent |量:7.06 |説明:友人のためLaunchcoupon"、 "テキスト文字列"、1、

+2

入力ファイルの内容と期待される結果を投稿します – RomanPerekhrest

+0

テキストの壁、入力データの例はなく、出力はありません。 Downvoted。 –

+0

こんにちはAnton、 私の投稿を編集し、サンプルデータを追加しました。私のルーキーミスには申し訳ありません。ガイドに従ってください。 –

答えて

0
ます。また、このようなCSVからのデータを操作するためにパンダを使用することができます

df = pandas.read_csv(filename) 

はの最初の行のdeepcopyを行います

import pandas 
import copy 

はパンダのデータフレームにcsvファイルを読みますアイテムの小計に割引合計を追加します。

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ありがとうございました 私は、明日のコメントと私の結果を投稿します。 私はパンダをあまり使用していませんが、はい、私はこの話題についてもっと勉強したり練習したりする必要があるようです。 –

+0

こんにちはL.マッケンジー お返事ありがとうございました!本当に私はこのコードを時間のために書くことができませんでしたが、パンダで経験したことはありませんが、私はすでに勉強している素晴らしい図書館のようです。 コードをテストしましたが、次のエラーが表示されます。KeyError: 'ラベル[1]が[index]にありません。' Iveは自分の投稿を編集してCSVを追加しました。 ExcelでCSVを開くと、csvの内容がうまく行に表示されますが、メモ帳で開くと行が表示されません。 その値は今どのように変更されますか? ありがとうございました –

+0

メモ帳++はcsvファイルをテキストファイルとして扱いますが、Excelではcsv(カンマ区切りの値)として扱われ、値が異なる列に区切られています。そのため、ExcelとNotepad ++では異なって見えるのです。あなたが得ているKeyErrorに関しては、使用したcsvファイルで実行した完全なTracebackとコードなしでデバッグするのは難しいです。 –

0

最初のステップは、その.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

こんにちはKeith、 私はあなたの提案に従っていますが、それはコンソールにリストを出力しますが、次のエラーが出ます:TypeError:記述子 'insert'は 'list'オブジェクトを必要としますが、 'str'を受け取りました その整数を他の値に変更しようとしましたが、それを正しく行う方法はまだ分かりませんでした。 ありがとうございます。 まもなく、私も他の人を援助することができます!より –

+0

何か、 私が追加いけない場合: DEF listTemp(リスト): listTemp =リストの前に[1] など。 私はエラーを取得する:TypeError例外: 'タイプ' オブジェクトは、明確にするために –

+0

の添字ではありません私はPython 2.7を使用しています...私はランダムなテスト.csvファイルで動作するコードを取得することができます。私は実際に変数名として 'list'を使っているわけではありません。また、 'import copy'を使用し、 'listTemp = copy.deepcopy(ilist [1])'の代わりに 'ilist [1]'の実際のコピーを作成する必要があります。 –

関連する問題