我目前所拥有的是我接收一个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()
答案 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
希望这有点帮助你。