使用Python将csv中的数字数据从字节转换为千字节

时间:2016-02-09 14:26:35

标签: python csv

我目前所拥有的是我接收一个cvs文件并确定给定开始时间和结束时间之间的相关数据。我将这些相关数据写入不同的cvs文件。所有这一切都正常。

我想要做的是将原始cvs文件中的所有数字数据(不接触日期或时间)从字节转换为千字节,并在呈现千字节值时仅取一个小数位。这些改变的数值数据是我想要写入新的cvs文件的。

数值数据似乎是一个字符串,因此我们有点不确定如何做到这一点,任何帮助都会受到赞赏。

原始CSV(在excel中打开时)如下所示:

Date:-------- | Title1:----- | Title2: | Title3: | Title4:

01/01/2016 | 32517293 | 45673 | 0.453 |263749

01/01/2016 | 32721993 | 65673 | 0.563 |162919

01/01/2016 | 33617293 | 25673 | 0.853 |463723

但我希望新的CSV看起来像这样:

Date:-------- | Title1:--- | Title2: | Title3: | Title4:

01/01/2016 | 32517.2 | 45673 | 0.0 | 263.749

01/01/2016 | 32721.9 | 65673 | 0.0 | 162.919

01/01/2016 | 33617.2 | 25673 | 0.0 | 463.723

到目前为止我的Python功能:

def edit_csv_file(Name,Start,End):

#Open file to be written to 
f_writ = open(logs_folder+csv_file_name, 'a')
#Open file to read from (i.e. the raw csv data from the windows machine)
csvReader = csv.reader(open(logs_folder+edited_csv_file_name,'rb'))

#Remove double quotation marks when writing new file
writer = csv.writer(f_writ,lineterminator='\n', quotechar = '"')


for row in csvReader:

    #Write the data relating to the modules greater than 10 seconds
    if get_sec(row[0][11:19]) >= get_sec(Start):
        if get_sec(row[0][11:19]) <= get_sec(End):
            writer.writerow(row)

f_writ.close()

5 个答案:

答案 0 :(得分:0)

int()是python中将字符串转换为int的标准方法。它像

一样使用
int("5") + 1

这将返回6.希望这会有所帮助。

答案 1 :(得分:0)

如果s是表示字节值的字符串,则可以转换为表示千字节值的字符串,其中包含一个小数位,如下所示:

'%.1f' % (float(s)/1024)

可替换地:

str(round(float(s)/1024, 1))

修改

为防止非数字字符串出错,您只需制作条件

即可
'%.1f' % (float(s)/1024) if s.isdigit() else ''

答案 2 :(得分:0)

以下内容可以满足您的需求:

import csv

with open('input.csv', 'rb') as f_input, open('output.csv', 'wb') as f_output:
    csv_input = csv.reader(f_input)
    csv_output = csv.writer(f_output)
    csv_output.writerow(next(csv_input))    # write header

    for cols in csv_input:
        for col in range(1, len(cols)):
            try:
                cols[col] = "{:.1f}".format(float(cols[col]) / 1024.0)
            except ValueError:
                pass
        csv_output.writerow(cols)

为您提供以下输出csv文件:

Date:--------,Title1:-----,Title2:,Title3:,Title4:
01/01/2016,31755.2,44.6,0.0,257.6
01/01/2016,31955.1,64.1,0.0,159.1
01/01/2016,32829.4,25.1,0.0,452.9

使用Python 2.7.9进行测试

答案 3 :(得分:0)

根据您可能会发现的其他内容,我会尝试使用pandas - 在导入pandas模块后给出包含您描述的内容的文件:

import pandas as pd

读入csv文件(自动识别第一行是标题) - 你的情况下的分隔符可能不需要指定 - 如果它是默认的逗号 - 但是其他分隔符可用 - 我是管道的粉丝'|'字符。

csv = pd.read_csv("pandas_csv.csv",delimiter="|")

然后,您可以使用列名作为参考来丰富/处理您的数据。

例如,要按照某些因素转换列,您可以编写:

csv['Title3'] = csv['Title3']/1024

再次自动确定数据类型,因此如果列是全数字(如示例中所示),则无需在99%的时间内从数据类型转换为数据类型,它会根据文件中的数据。

如果对编辑感到满意,请输入

csv

要查看结果的表示,然后

csv.to_csv("pandas_csv.csv")

要保存结果(在这种情况下,请覆盖原始文件,但您可能希望编写更类似的内容:

csv.to_csv("pandas_csv_kilobytes.csv")

有更多有用/强大的功能可用,但我知道操作表格数据的方法比这更简单 - 它比Excel更好,更可靠,并且在未来几年,你将庆祝你开始使用大熊猫的那一天! / p>

在这种情况下,您使用以下4行代码打开,编辑和保存文件:

import pandas as pd
csv = pd.read_csv("pandas_csv.csv",delimiter="|")
csv['Title3'] = csv['Title3']/1024
csv.to_csv("pandas_csv_kilobytes.csv")

这就像它获得的那样强大和方便。

答案 4 :(得分:0)

使用func(bytesto)的另一个解决方案来自:gist.github.com/shawnbutts/3906915

def bytesto(bytes, to):
    a = {'k' : 1, 'm': 2, 'g' : 3, 't' : 4, 'p' : 5, 'e' : 6 }
    r = float(bytes)
    for i in range(a[to]):
        r = r / 1024
    return(int(r)) # ori not return int

with open('csvfile.csv', 'rb') as csvfile:
    data = csv.reader(csvfile, delimiter='|', quotechar='|')
    row=iter(data)
    next(row) # Jump title
    for row in data:
        print 'kb= ' + str(bytesto((row[1]), 'k')), 'kb= ' + str(bytesto((row[2]), 'k')), 'kb= ' + str(bytesto((row[3]), 'k')), 'kb= ' + str(bytesto((row[4]), 'k'))

结果:

kb= 31755 kb= 44 kb= 0 kb= 257
kb= 31955 kb= 64 kb= 0 kb= 159
kb= 32829 kb= 25 kb= 0 kb= 452

希望这有点帮助你。