簡體   English   中英

格式化為3個小數位,csv文件python中的所有小數

[英]format to 3 decimal places all decimal number in csv file 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM