簡體   English   中英

Python 3.5在重寫期間將值轉換為新的csv

[英]Python 3.5 convert values during re-write to new csv

我有一個要寫入另一個文件的CSV文件,但是在此過程中要基於大於或小於的值來更改值。 例如,在新文件的列中(舊文件的第2行),我想根據列中的值將數據從數字轉換為單詞。 我的實際數據有更多的列和數千行,不超過1萬行。 示例如下:

Input.csv
duck,35,35
car,100,502
baseball,200,950
gun,500,495
taco,300,300
guitar,100,700
barbie, 200,25
gum,300,19

Desired Output.csv
duck,35,35,order now
car,100,502,order next month
baseball,200,950,no order necessary
gun,500,495,order next month
taco,300,300,order next month
guitar,100,700,order next month
barbie, 200,25,order urgent
gum,300,19,order urgent

到目前為止,這是我的代碼,但是在將金額轉換為新值時遇到了麻煩。 我想我需要使用枚舉,但是在我用這種方法進行csv轉換的研究中沒有找到任何示例。 請協助。

import csv

with open('INTERIM RESULTS.CSV', 'r') as source:
  rdr = csv.reader(source)
  with open('INTERIM RESULTS FIXED.CSV', 'w', newline = '') as result:
    wtr = csv.writer(result)
    for r in rdr:
      wtr.writerow( ( r[0], r[1], r[2] ) )

編輯:接受匿名的建議,我想出了下面的代碼。 問題是我的“ if” /“ elif”陳述中的某處我無法獲得正確的輸出。 我列出的輸出不正確,在下面列出。 請協助。

import  csv 
CODE0 = '25'
CODE1 = '50'
CODE2 = '500'
CODE3 = '900'

with open('input.csv', 'r')  as  source, open('output.csv', 'w')  as  result: 
    reader = csv.reader(source) 
    writer = csv.writer(result) 
    for  row in  reader: 
        val = row[2]
    if val <= CODE0: # below 25 order urgent
            writer.writerow( ( row[0], row[1], row[2], 'order urgent'))
    elif val <= CODE1: # below 50 order now
        writer.writerow( ( row[0], row[1], row[2], 'order now'))
    elif val <= CODE2: # below 500 order next month
        writer.writerow( ( row[0], row[1], row[2], 'order next month'))
    elif val < CODE3: # below 900 order next month
        writer.writerow( ( row[0], row[1], row[2], 'order next month'))
    elif val >= CODE3: #over 900 no order necessary
        writer.writerow( ( row[0], row[1], row[2], 'no order necessary'))

Output.csv
duck,35,35,order now
car,100,502,order next month
baseball,200,950,no order necessary
gun,500,495,order now    (this is wrong, should be next month)
taco,300,300,order now    (this is wrong, should be next month)
guitar,100,700,order next month
barbie, 200,25,order urgent
gum,300,19,order urgent

編輯:我走了另一條路,並在Anonymou的指導下解決了我的問題。 請在下面查看對我有用的方法:我不得不放棄大於范圍的選擇,而選擇范圍。 我還必須刪除“ val”以使其正常工作。

import csv

with open 'input.csv', 'r') as source
  rdr = csv.reader(source)
  with open ('output.csv', 'w', newline = '') as result:
    wtr = csv.writer(result)
    for r in rdr:
    if int (r[2]) in range(0,36):
      wtr.writerow ( ( r[0], r[1], 'order urgent' ) )
    elif int(r[2]) in range(36,51):
      wtr.writerow ( ( r[0], r[1], 'order now' ) )
    elif int(r[2]) in range(51,501):
      wtr.writerow ( ( r[0], r[1], 'order next month' ) )
    elif int(r[2]) in range(501,999):
      wtr.writerow ( ( r[0], r[1], 'no need to order' ) )

您需要具有某種功能或某些功能來處理數據(第三列)。 這是一種方法:

    import csv

# expected codes and their replacements
CODES = {
    '50': 'order now',
    '999': 'no order necessary',
    '500': 'order next month',
    'amount available': 'order timeline'
}

# you can multiple with statements in one
with open('input.csv', 'r') as fp_in, open('output.csv', 'w') as fp_out:
    reader = csv.reader(fp_in)
    writer = csv.writer(fp_out)

    for row in reader:
        val = row[2].strip() # deal with the weird spaces 
        val = CODES.get(val, val) # see if this is a known constant, and replace if exists
        row[2] = ' ' + val # add space back and insert back into row

        writer.writerow(row)

我必須添加一些代碼來保持文件包含的怪異間距。 根據需要進行調整。

我假設可用數量列會影響最終csv文件中的結果。 我建議您看一下pandas軟件包,它可以輕松處理csv文件。 您可以將第一個文件讀入pandas並創建一個新列,其值取決於可用數量列中的值。 像這樣:

import pandas as pd
df = pd.read_csv("Interim_results.csv")
for i in range(len(df)):
    if df.loc[i, "amt"] > 50:
        df.loc[i, "new"] = "Order Now"
        # Add other if statements to suit your needs
    df = df.drop('amt', 1)
    df.to_csv("Final.csv")

暫無
暫無

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

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