如何在Python中减少数字的数字?

时间:2015-07-31 15:27:38

标签: python csv

我有一个" CSV"文件有四列:

rep   par  comm    value
USA   GER  60705    100
USA   GER  607034   200
GER   US   607094   300
US    UK   60709    340

我打算减少comm列的值,并将它们更改为四位数字,如下所示:

rep   par  comm    value
USA   GER  6070     100
USA   GER  6070     200
GER   US   6070     300
US    UK   6070     340

为此,我写了以下代码:

infile=csv.reader(open("filepath"))
wfile=open("newfilpath", "wb")
writer=csv.writer(wfile, delimiter=",")
writer.writerow(["rep","par","comm","value"])
infile.next()
for row in infile:
    comm=row[2]
    hs4=comm[0:4]
    writer.writerow([row[0],row[1],hs4,row[3]])
wfile.close()

但是对于像60705和60709这样的数字(5位数字),我得到607而不是6070.
更新:我意识到Python为5位数加零,60705为060705为例。我不知道如何解决这个问题。这是我对真实数据的输出:

'ALB,DNK,880390,11678\n'
'ALB,FIN,961420,10377\n'
'ALB,FRA,030741,10857\n'
'ALB,FRA,030749,4300\n'
'ALB,FRA,091050,14861\n'
'ALB,FRA,121190,1049561\n'
'ALB,FRA,130219,7291\n'

所有以零开头的数据实际上都是5位数,而Python会自动将零添加到数据中。

3 个答案:

答案 0 :(得分:4)

可能是你在6前面有一个空格。你可以试试.strip()方法来摆脱它。我在这里稍微修改了你的代码:

编辑:现在删除前导零

import csv

with open("filepath") as ifile, open("newfilpath", "wb") as wfile:
    infile = csv.reader(ifile)
    writer = csv.writer(wfile)
    writer.writerow(next(infile))
    for row in infile:
        row[2] = row[2].strip().lstrip('0')[:4]
        writer.writerow(row)

答案 1 :(得分:1)

我建议使用pandas尝试以下方法。

import pandas as pd
df=pd.read_csv("test.csv")
print df
t=(df['comm']).astype(str)
for i in t:
    print i[:4]

输出:

   rep  par    comm  value
0  USA  GER   60705    100
1  USA  GER  607034    200
2  GER   US  607094    300
3   US   UK   60709    340
6070
6070
6070
6070

答案 2 :(得分:1)

使用略微修改的代码来读取CSV文件,我得到:

import csv

infile=csv.reader(open("filepath"), delimiter=" ", skipinitialspace=True)
wfile=open("newfilpath", "wb")
writer=csv.writer(wfile, delimiter=",")
writer.writerow(["rep","par","comm","value"])
infile.next()
for row in infile:
    print row
    comm=row[2]
    hs4=comm[0:4]
    writer.writerow([row[0],row[1],hs4,row[3]])


wfile.close()}

输入:

rep   par  comm    value
USA   GER  60705    100
USA   GER  607034   200
GER   US   607094   300
US    UK   60709    340

使用您的代码,我得到一个输出:

rep,par,comm,value
USA,GER,6070,100
USA,GER,6070,200
GER,US,6070,300
US,UK,6070,340

我唯一能想到的是在您读取CSV文件时更改分隔符设置或跳过初始空间。