【问题标题】:Convert Comma Separated Values to Dict将逗号分隔值转换为字典
【发布时间】:2015-05-20 21:44:27
【问题描述】:

我有一些文本数据

>>> print content
Date,Open,High,Low,Close,Volume,Adj Close
2015-03-17,4355.83,4384.98,4349.69,4375.63,1724370000,4375.63
2015-03-16,4338.29,4371.46,4327.27,4370.47,1713480000,4370.47
2015-03-13,4328.09,4347.87,4289.30,4314.90,1851410000,4314.90
2015-03-12,4302.73,4339.20,4300.87,4336.23,1855110000,4336.23
2015-03-11,4336.05,4342.87,4304.28,4305.38,1846020000,4305.38

现在我想将其转换为字典,以便我可以使用 cursor.executemany 将其加载到数据库中,这允许我提供字典作为输入。

是否有一个模块可以自动将其转换为字典。我查看了 Numpy - loadtext 但这需要我先将其写入文件。有没有办法在不创建文件的情况下做到这一点?

【问题讨论】:

  • Python 有一个csv 模块...它有一个DictReader 类...
  • 可以创建类文件对象StringIO

标签: python csv dictionary


【解决方案1】:

使用csv.DictReader

>>> with open('text.txt') as f:
...     dreader = csv.DictReader(f)
...     for row in dreader:
...         print(row)
... 
{'Adj Close': '4375.63', 'High': '4384.98', 'Volume': '1724370000', 'Low': '4349.69', 'Close': '4375.63', 'Open': '4355.83', 'Date': '2015-03-17'}
{'Adj Close': '4370.47', 'High': '4371.46', 'Volume': '1713480000', 'Low': '4327.27', 'Close': '4370.47', 'Open': '4338.29', 'Date': '2015-03-16'}
{'Adj Close': '4314.90', 'High': '4347.87', 'Volume': '1851410000', 'Low': '4289.30', 'Close': '4314.90', 'Open': '4328.09', 'Date': '2015-03-13'}
{'Adj Close': '4336.23', 'High': '4339.20', 'Volume': '1855110000', 'Low': '4300.87', 'Close': '4336.23', 'Open': '4302.73', 'Date': '2015-03-12'}
{'Adj Close': '4305.38', 'High': '4342.87', 'Volume': '1846020000', 'Low': '4304.28', 'Close': '4305.38', 'Open': '4336.05', 'Date': '2015-03-11'}

我查看了 Numpy - loadtext,但这需要我先将其写入文件。有没有一种方法可以在不创建文件的情况下做到这一点?

如果您不想拥有物理数据,可以使用文件之类的对象。

  • 使用tempfile.TemporaryFile

    from tempfile import TemporaryFile
    
    with TemporaryFile('w+t') as flike:
        flike.write(content)
        flike.seek(0)
        dreader = csv.DictReader(flike)
        for row in dreader:
            #do something
    
  • 使用io.StringIO

    import io #python3 or import StringIO in python2
    flike = io.StringIO(content)
    for row in csv.DictReader(flike)
        #do something
    

【讨论】:

  • 你可以通过flike = io.StringIO(content)初始化内容然后直接跳到for循环...
猜你喜欢
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
相关资源
最近更新 更多