【问题标题】:Read and process a text file and save to csv读取和处理文本文件并保存到 csv
【发布时间】:2017-05-09 17:26:30
【问题描述】:

我的文件似乎是“dict”格式...

文件头如下:time,open,high,low,close,volume

下一行如下: {"t":[1494257340],"o":[206.7],"h":[209.3],"l":[204.50002],"c":[204.90001],"v":[49700650]}`

    import csv
    with open ('test_data.txt', 'rb') as f:

    for line in f:
        dict_file = eval(f.read())
        time = (dict_file['t'])    # print (time) result [1494257340]
        open_price = (dict_file['o'])    # print (open_price) result [206.7]
        high = (dict_file['h'])    # print (high) result [209.3]
        low = (dict_file['l'])    # print (low) result [204.50002]
        close = (dict_file['c'])    # print (close) result [204.90001]
        volume = (dict_file['v'])    # print (volume) result [49700650]

        print (time, open_price, high, low, close, value)

# print result [1494257340] [206.7] [209.3] [204.50002] [204.90001] [49700650]

# I need to remove the [] from the output.

# expected result 

# 1494257340, 206.7, 209.3, 204.50002, 204.90001, 49700650

我需要的结果是(将时间(“纪元日期格式”)更改为 dd,mm,yy

5/8/17, 206.7, 209.3, 204.50002, 204.90001, 49700650

所以我知道我需要 csv.writer 函数

【问题讨论】:

  • 你试过把字符串转换成字节吗?
  • 我对python有点陌生,我不知道怎么做,看了很多youtube视频告诉我如果你有时间怎么做
  • 我的意思是我不能真正帮助你,因为你只给了我们你的一部分代码。甚至不是您需要帮助的写入部分。但至少我可以为你做到这一点。 docs.python.org/3.3/howto/unicode.html 有很多方法可以将 str 转换为字节。您可以通过该链接找到它们,而且非常简单。另外我想指出,您应该将 close = (dict__file['c']) 重命名为其他名称,因为它会与 f.close() 冲突。任何方式去那个链接它应该帮助你。你可以做 value = (dict_file[b'v']) 但它可能不起作用。
  • 谢谢,我去看看链接
  • 如果你“看了很多python教程”,你应该知道[...]在python中是什么意思

标签: python string python-3.x csv byte


【解决方案1】:

我发现您提交的代码存在许多问题。我建议你把你的任务分成小块,看看你是否可以让它们单独工作。所以你想做的是:

  1. 打开一个文件
  2. 逐行读取文件
  3. eval 每行获取一个dict 对象
  4. 从该对象获取值
  5. 将这些值写入(单独的?)csv 文件中

对吗?

现在做每一个,一次一小步

  1. 打开一个文件。

你说得很对:

with open('test_data.txt', 'rb') as f:
    print(f.read())

# b'{"t":[1494257340],"o":[207.75],"h":[209.8],"l":[205.75],"c":[206.35],"v":[61035956]}\n'

你可以用r模式打开文件,它会给你字符串而不是byte类型的对象

with open('test_data.txt', 'r') as f:
    print(f.read())

# {"t":[1494257340],"o":[207.75],"h":[209.8],"l":[205.75],"c":[206.35],"v":[61035956]}

它可能会导致一些问题,但应该可以工作,因为 eval 可以很好地处理它(至少在 python 3 中)

  1. 逐行读取文件
with open('test_data.txt', 'rb') as f:
    for line in f:
        print(line)

# b'{"t":[1494257340],"o":[207.75],"h":[209.8],"l":[205.75],"c":[206.35],"v":[61035956]}\n'

这是您的代码中的另一个问题,您没有使用line 变量而是尝试使用f.read()。这只会读取整个文件(从第二行开始,因为已经读取了第一行)。试着换一个看看会发生什么

  1. eval 每行获取一个dict 对象

再次。这工作正常。但我会在这里添加一些保护。如果文件中出现空行或格式错误怎么办。此外,如果此文件来自不受信任的来源,您可能会成为此处代码注入的受害者,例如文件中的一行更改为:

print("You've been hacked") or {"t":[1494257340],"o":[207.75],"h":[209.8],"l":[205.75],"c":[206.35],"v":[61035956]}

with open('test_data.txt', 'rb') as f:
    for line in f:
        dict_file = eval(line)
        print(dict_file)

# You've been hacked
# {'t': [1494257340], 'o': [207.75], 'h': [209.8], 'l': [205.75], 'c': [206.35], 'v': [61035956]}

我不知道你的确切规格,但你应该改用json.loads 更安全。

...


你能从那里继续自己吗?

  1. 从对象中获取值

我认为dict_file['t'] 并没有给你所期望的价值。

它给了你什么?

为什么?

如何解决?

  1. 将这些值写入 csv 文件

你能写一些随机字符串到文件吗?

scv 格式是什么样的?你能格式化你的值来匹配它吗

查看csv 模块的文档,对您有帮助吗?

等等等等……


编辑:解决方案

# you can save the print output in a file by running:
# $ python convert_to_csv.py > output.cvs
import datetime, decimal, json, os


CSV_HEADER = 'time,open,high,low,close,volume'


with open('test_data.txt', 'rb') as f:

    print(CSV_HEADER)

    for line in f:
        data = json.loads(line, parse_float=decimal.Decimal)
        data['t'][0] = datetime.datetime.fromtimestamp(data['t'][0]) \
            .strftime('%#d/%#m/%y' if os.name == 'nt' else '%-d/%-m/%y')
        print(','.join(str(data[k][0]) for k in 'tohlcv'))

跑步:

$ cat test_data.txt
{"t":[1494257340],"o":[207.75],"h":[209.8],"l":[205.75],"c":[206.35],"v":[61035956]}
{"t":[1490123123],"o":[107.75],"h":[109.8],"l":[105.75],"c":[106.35],"v":[11035956]}
{"t":[1491234234],"o":[307.75],"h":[309.8],"l":[305.75],"c":[306.35],"v":[31035956]}

$ python convert_to_csv.py
time,open,high,low,close,volume
8/5/17,207.75,209.8,205.75,206.35,61035956
21/3/17,107.75,109.8,105.75,106.35,11035956
3/4/17,307.75,309.8,305.75,306.35,31035956

【讨论】:

  • 非常感谢您的建议,我会按照您的建议进行处理
  • @bobbin 当你解决问题(或再次碰壁)时 ping 我,我会发布一个完整的解决方案供你查看。我想如果我不立即发布它会对你更好。干杯!
  • 用 open('test_data.txt') 导入 csv 作为 csvfile: reader = csv.DictReader(csvfile) for row in reader: print(row['time'], row['open'] , row['high'], row['low'], row['close'], row['volume']) csvfile.close
  • Igonato,我想要一个完整的解决方案,因为我只是卡住了thankyou..有感谢按钮吗?
  • @bobbin 很难从 cmets 读取代码。你可以更新你的问题吗?另外,请描述您要对代码做什么以及出了什么问题,表现出一些努力,更具体(请参阅此常见问题解答帖子meta.stackoverflow.com/a/334823/723891)您可以在此站点上对问题和答案进行投票,我相信您需要不过要先获得 15 声望
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 2017-05-04
  • 2019-01-15
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
相关资源
最近更新 更多