转换一个巨大的txt-fi

2024-09-28 21:06:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个huuge csv文件(524mb,记事本打开它4分钟),我需要改变格式。现在是这样的:

1315922016 5.80000000 1.000000000000 1315922024 5.830000000000 3.000000000000 1315922029 5.900000000000 1.000000000000 1315922034 6.000000000000 20.000000000000 1315924373 5.9500000000012.45210000000

行由换行符分隔,当我将其粘贴到Excel中时,它会分成行。我会用Excel函数来做,但是文件太大了,无法打开。 第一个值是自1970年1月1日以来的秒数,第二个值是价格,第三个值是体积。你知道吗

我需要这样:

01-01-2009 13:55:59 5.800000000000 1.000000000000 01-01-2009 13:56:00 5.830000000000 3.000000000000

等等

记录需要用空格隔开。有时,同一秒有多个价格值,如下所示:

1328031552 6.10000000000 2.000000000000
1328031553 6.110000000000 0.34295163000
1328031553 6.110000000000 0.527604200000
1328031553 6.110000000000 0.87608837万
1328031553 6.110000000000 0.971026920000
1328031553 6.100000000000.965781090000
1328031589 6.15000000000.918752490000
1328031589 6.15000000000 0.940974100000

当这种情况发生时,我需要代码从那一秒取平均价格,每秒钟只保存一个价格。 这些都是比特币交易,在BTC启动时并不是每秒钟都发生。 当某一秒没有记录时,需要创建一个新记录,该记录具有以下秒,并且price和volumen的值是从上一个已知的price和volumen复制的。你知道吗

然后将所有内容保存到一个新的txt文件中。你知道吗

我似乎做不到,我已经试着用python写了几个小时的转换器,请帮忙。你知道吗


Tags: 文件csv函数粘贴格式记录价格excel
2条回答

shlex是一个词法分析器。我们用它从输入中一次选取一个数字。函数records将这些元素分组到列表中,其中列表的第一个元素是整数,其他元素是浮点。你知道吗

循环读取records的结果,并根据需要对时间进行平均。它还将两个输出打印到一行。你知道吗

from shlex import shlex
lexer = shlex(instream=open('temp.txt'), posix=False)
lexer.wordchars = r'0123456789.\n'
lexer.whitespace = ' \n'
lexer.whitespace_split = True

import time

def Records():
    record = []
    while True:
        token = lexer.get_token()
        if token:
            token = token.strip()
            if token:
                record.append(token)
                if len(record)==3:
                    record[0] = int(record[0])
                    record[1] = float(record[1])
                    record[2] = float(record[2])
                    yield record
                    record=[]
            else:
                break
        else:
            break

def conv_time(t):
    return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(t))

records = Records()

pos = 1
current_date, price, volume = next(records)
price_sum = price
volume_sum = volume
count = 1

for raw_date, price, volume in records:
    if raw_date == current_date:
        price_sum += price
        volume_sum += volume
        count += 1
    else:
        print (conv_time(current_date), price_sum/count, volume_sum/count, end=' ' if pos else '\n')
        pos = (pos+1)%2
        current_date = raw_date
        price_sum = price
        volume_sum = volume
        count = 1

print (conv_time(current_date), price_sum/count, volume_sum/count, end=' ' if pos else '\n')

以下是结果。您可能需要对小数点右边的有效数字做一些处理。你知道吗

2011-09-13 09:53:36 5.8 1.0 2011-09-13 09:53:44 5.83 3.0
2011-09-13 09:53:49 5.9 1.0 2011-09-13 09:53:54 6.0 20.0
2011-09-13 10:32:53 5.95 12.4521 2012-01-31 12:39:12 6.1 2.0
2012-01-31 12:39:13 6.108 0.736690442 2012-01-31 12:39:49 6.15 0.9298632950000001

1)从文件中读取单行

data = {}
with open(<path to file>) as fh:
    while True:
        line = fh.readline()[:-1]
        if not line: break

        values = line.split(' ')
        for n in range(0, len(values), 3):
            dt, price, volumen = values[n:n+3]

2)检查是否是最后一条记录后的下一秒
如果是这样,将价格和体积值添加到一个变量中,并增加一个计数器,以便以后在计算平均值时使用
3) 如果第二个不是下一个,复制上一个price和volumen的值。你知道吗

            if not dt in data:
                data[dt] = []

            data[dt].append((price, volumen))

4)将时间戳(如“1328031552”)分为秒、分、时、日、月、年。
一定要照顾好空档年。你知道吗

for dt in data:
    # seconds, minutes, hours, days, months, years = datetime (dt)

。。。供以后计算平均值时使用

    p_sum, v_sum = 0
    for p, v in data[dt]:
        p_sum += p
        v_sum += v

    n = len(data[dt])
    price = p_sum / n
    volumen = v_sum / n

5)在01-01-2009 13:55:59 1586.12 220000订单中排列值
6) 将记录添加到新数据库文件的末尾。你知道吗

    print(datetime, price, volumen)

相关问题 更多 >