格式为 3 小数,将 CSV 文件 Python 中的所有十进制数放入


index,Adj Close,Close,High,Low,Open,SMA_100,SMA_20,SMA_5,SMA_50,Volume,code,date_of_trade
0,2.8999999999999999,2.8999999999999999,2.9700000000000002,2.8300000000000001,2.9300000000000002,3.8003000000000009,3.2214999999999998,3.1319999999999992,3.0767999999999969,631100,1PG,2016-02-05 00:00:00

以上是我的文件。我想做的是将所有十进制数限制为小数点后 3 位(如 2.333)并写入另一个文件。我正在使用python读取文件。是否有在文件级别而不是在每个列级别执行此操作?如果需要在列级别完成,最好的方法是什么?

你可以使用Python的csv库,如下所示:

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 i in xrange(1, 10):
            cols[i] = '{:.3f}'.format(float(cols[i]))
        csv_output.writerow(cols)

这将为您提供一个输出文件,如下所示:

index,Adj Close,Close,High,Low,Open,SMA_100,SMA_20,SMA_5,SMA_50,Volume,code,date_of_trade
0,2.900,2.900,2.970,2.830,2.930,3.800,3.221,3.132,3.077,631100,1PG,2016-02-05 00:00:00

如果要正确的舍入,则必须读取每一列并将其转换为整数。如果将其保留为字符串,最好的办法是将数字截断为小数点后的 3 位数字。

为了舍入,您应该使用round基元(见这里)。

如果截断就足够了,您仍然必须逐行读取文件并将输出写入新文件,但您可以使用正则表达式。从本质上讲,您要做的是:

import re
for line in file:
    newline = re.sub(r"(d.d{3})(d*)", r"1", line)
    print(newline, file=newfile)

第一个解决方案将给出这个:

index,Adj Close,Close,High,Low,Open,SMA_100,SMA_20,SMA_5,SMA_50,Volume,code,date_of_trade
 0,2.9,2.9,2.97,2.83,2.93,3.8,3.221,3.132,3.0768,631100,1PG,2016-02-05 00:00:00

第二个是这个:

index,Adj, Close,Close,High,Low,Open,SMA_100,SMA_20,SMA_5,SMA_50,Volume,code,date_of_trade
0,2.899,2.899,2.970,2.830,2.930,3.800,3.221,3.131,3.076,631100,1PG,2016-02-05 00:00:00

最新更新