如何使用python中的mmap打开csv文件以进行阅读?

糯米饭

我想打开csv文件以供阅读。但是我正面临一些例外。

我正在使用Python 2.7。

main.python-

if __name__ == "__main__":

   f = open('input.csv','r+b')
   m = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
   reader = csv.DictReader(iter(m.readline, ""))

for read in reader:
    num = read['time']
    print num

输出-

Traceback (most recent call last):
File "/home/PycharmProjects/time_gap_Task/main.py", line 22, in <module>
for read in reader:
File "/usr/lib/python3.4/csv.py", line 109, in __next__
   self.fieldnames
File "/usr/lib/python3.4/csv.py", line 96, in fieldnames
   self._fieldnames = next(self.reader)
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

如何解决这个错误?以及如何以良好的方式使用mmap和csv打开csv文件,以使代码运行完美?

莫里斯·里夫斯(Maurice Reeves)

我知道您之前曾问过这个问题,但实际上我为自己创建了一个模块来执行此操作,因为我对大型CSV文件做了很多工作,有时我需要根据密钥将它们转换为字典。下面是我一直在使用的代码。请随时根据需要进行修改。

def MmapCsvFileIntoDict(csvFilePath, skipHeader = True, transform = lambda row: row, keySelector = lambda o: o):
    """
    Takes a CSV file path and uses mmap to open the file and return a dictionary of the contents keyed
    on the results of the keySelector.  The default key is the transformed object itself.  Mmap is used because it is
    a more efficient way to process large files.

    The transform method is used to convert the line (converted into a list) into something else.  Hence 'transform'.
    If you don't pass it in, the transform returns the list itself.
    """
    contents = {}
    firstline = False

    try:
        with open(csvFilePath, "r+b") as f:
            # memory-map the file, size 0 means whole file
            mm = mmap.mmap(f.fileno(), 0)
            for line in iter(mm.readline, b''):
                if firstline == False:
                    firstline = True

                    if skipHeader == True:
                        continue

                row = ''

                line = line.decode('utf-8')
                line = line.strip()

                row = next(csv.reader([line]), '')

                if transform != None and callable(transform):
                    if row == None or row == '':
                        continue

                    value = transform(row)
                else:
                    value = row

                if callable(keySelector):    
                    key = keySelector(value)
                else:
                    key = keySelector

                contents[key] = value

    except IOError as ie:
        PrintWithTs('Error decomposing the companies: {0}'.format(ie))
        return {}
    except:
        raise

    return contents

调用此方法时,有一些选择。

假设您有一个看起来像这样的文件:

Id, Name, PhoneNumber 
1, Joe, 7175551212 
2, Mary, 4125551212 
3, Vince, 2155551212 
4, Jane, 8145551212

调用它的最简单方法是这样的:

dict = MmapCsvFileIntoDict('/path/to/file.csv', keySelector = lambda row: row[0])

您得到的是一个看起来像这样的字典:

{ '1' : ['1', 'Joe', '7175551212'], '2' : ['2', 'Mary', '4125551212'] ...

我想做的一件事是创建一个类或一个命名元组来表示我的数据:

class CsvData:
    def __init__(self, row):
        self.Id = int(row[0])
        self.Name = row[1].upper()
        self.Phone = int(row[2])

然后,当我调用该方法时,我传入第二个lambda来将文件中的每一行转换为可以使用的对象:

dict = MmapCsvFileIntoDict('/path/to/file.csv', transform = lambda row: CsvData(row), keySelector = lambda o: o.Id)

那个时候我回来的样子是:

{ 1 : <object instance>, 2 : <object instance>...

我希望这有帮助!祝你好运

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

您如何打开文件流以使用Scrapy进行阅读?

来自分类Dev

如何使用Python从URL打开.csv文件?

来自分类Dev

使用Python打开时对csv文件进行编码

来自分类Dev

如何仅在python 3中打开文件以进行附加

来自分类Dev

如何写回在python中打开csv文件

来自分类Dev

如何使用 sorted() 函数在 Python 3 中对 CSV 文件中的数据进行排序?

来自分类Dev

如何使用范围对csv文件中的列进行分组并使用python绘制直方图?

来自分类Dev

如何在python中对csv文件中的范围进行排序?

来自分类Dev

在Python中打开没有换行符的大型JSON文件以进行csv转换Python 2.6.6

来自分类Dev

如何使用正在进行的Python词典中的数据完成CSV文件

来自分类Dev

如何使用xargs在sublime中打开文件并使用python执行

来自分类Dev

如何使用awk对csv文件中的记录进行排序

来自分类Dev

如何使用awk对csv文件中的记录进行排序

来自分类Dev

如何使用java中的某些列对CSV文件进行排序

来自分类Dev

如何打开 Acrobat Reader 阅读 pdf 文件?

来自分类Dev

如何使用PHP不管名称如何打开文件夹中的.csv文件?

来自分类Dev

如何使用python在其默认程序中打开文件

来自分类Dev

如何使用名称中包含空格的 Python 打开文件?

来自分类Dev

打开-编辑-保存-使用python将csv文件循环到文件夹中

来自分类Dev

如何从具有python中文件列表的单个文件中打开多个文件,以及如何对其进行处理?

来自分类Dev

如何在python中打开csv?

来自分类Dev

使用Python 2.7中的CSV lib对CSV文件中的数据进行排序

来自分类Dev

如何使用python阅读和打印整个.txt文件?

来自分类Dev

在使用python脚本导入到postgres中之前,如何在csv文件中进行单元分割?

来自分类Dev

打开文件并阅读句子

来自分类Dev

在csv文件中对整数进行排序-python

来自分类Dev

如何阅读 Java中分离的csv文件?

来自分类Dev

如何在Outlook中使用VBA打开和阅读txt文件附件?

来自分类Dev

如何配置 Ranger 以使用福昕阅读器打开 pdf 文件

Related 相关文章

  1. 1

    您如何打开文件流以使用Scrapy进行阅读?

  2. 2

    如何使用Python从URL打开.csv文件?

  3. 3

    使用Python打开时对csv文件进行编码

  4. 4

    如何仅在python 3中打开文件以进行附加

  5. 5

    如何写回在python中打开csv文件

  6. 6

    如何使用 sorted() 函数在 Python 3 中对 CSV 文件中的数据进行排序?

  7. 7

    如何使用范围对csv文件中的列进行分组并使用python绘制直方图?

  8. 8

    如何在python中对csv文件中的范围进行排序?

  9. 9

    在Python中打开没有换行符的大型JSON文件以进行csv转换Python 2.6.6

  10. 10

    如何使用正在进行的Python词典中的数据完成CSV文件

  11. 11

    如何使用xargs在sublime中打开文件并使用python执行

  12. 12

    如何使用awk对csv文件中的记录进行排序

  13. 13

    如何使用awk对csv文件中的记录进行排序

  14. 14

    如何使用java中的某些列对CSV文件进行排序

  15. 15

    如何打开 Acrobat Reader 阅读 pdf 文件?

  16. 16

    如何使用PHP不管名称如何打开文件夹中的.csv文件?

  17. 17

    如何使用python在其默认程序中打开文件

  18. 18

    如何使用名称中包含空格的 Python 打开文件?

  19. 19

    打开-编辑-保存-使用python将csv文件循环到文件夹中

  20. 20

    如何从具有python中文件列表的单个文件中打开多个文件,以及如何对其进行处理?

  21. 21

    如何在python中打开csv?

  22. 22

    使用Python 2.7中的CSV lib对CSV文件中的数据进行排序

  23. 23

    如何使用python阅读和打印整个.txt文件?

  24. 24

    在使用python脚本导入到postgres中之前,如何在csv文件中进行单元分割?

  25. 25

    打开文件并阅读句子

  26. 26

    在csv文件中对整数进行排序-python

  27. 27

    如何阅读 Java中分离的csv文件?

  28. 28

    如何在Outlook中使用VBA打开和阅读txt文件附件?

  29. 29

    如何配置 Ranger 以使用福昕阅读器打开 pdf 文件

热门标签

归档