2016-05-28 42 views
0

转换期间值我有我写到另一个文件CSV文件,但在这个过程中要基于大于或小于更改值。例如,在新文件的列(第2行)中,我想根据列中的值将数据中的数据转换为单词。我的实际数据有更多列和数千行,不超过10K行。示例如下:的Python 3.5重新写入新的CSV

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”语句中,我无法获得正确的输出。输出我currenlty得到是不正确的,列在下面。请协助。

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')) 

回答

0

您需要有一个函数或其他东西来处理数据(第3列)。这是一个这样做的方法:

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) 

我不得不添加一些代码来保持您的文件包含奇怪的间距。根据需要调整。

+0

这很快,欣赏输入。我如何使它的功能大于或等于现在小于50的订单,或者下个月大于300小于500的订单?我会试着将它放入函数中,看看它是如何工作的,以及它是否像听起来那么容易。 – james

+0

是的,只需创建一个函数来分析值('str',但你需要'int'来比较),然后使用if语句来实现你想要的。替换'CODES.get(val,val)'使其工作。 – Anonymous

0

我假设可用数量列会影响最终csv文件中的结果。我建议你看看熊猫包,它可以轻松操纵一个CSV文件。您可以将第一个文件读入熊猫,并创建一个新的列,其值取决于可用数量列中的值。像这样:

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") 
+0

我很欣赏熊猫产品。不幸的是,我不能使用熊猫,因为这是一个脚本,将被大量的人使用,我不想让Python的安装过程复杂化,而不仅仅是Python 3.5。从我读过的大熊猫必须在Python之后安装。无论如何,感谢您的帮助。 – james