【问题标题】:How to obtain the total numbers of rows from a CSV file in Python?如何从 Python 中的 CSV 文件中获取总行数?
【发布时间】:2013-04-13 01:51:30
【问题描述】:

我正在使用 python(Django 框架)来读取 CSV 文件。如您所见,我只从这个 CSV 中提取了 2 行。我一直在尝试做的是将 CSV 的总行数也存储在一个变量中。

如何获取总行数?

file = object.myfilePath
fileObject = csv.reader(file)
for i in range(2):
    data.append(fileObject.next()) 

我试过了:

len(fileObject)
fileObject.length

【问题讨论】:

  • 什么是file_read?是文件句柄吗(如file_read = open("myfile.txt")?
  • file_read = csv.reader(file) 更新的问题现在应该有意义了。
  • 查看这个问题以了解有关该主题的想法:stackoverflow.com/questions/845058/…
  • @martjin-pieters 接受的答案是正确的,但这个问题的措辞很糟糕。在您的伪代码中,您几乎肯定要计算 rowsrecords 的数量——而不是“计算 CSV 中有多少 lines ”。因为某些 CSV 数据集可能包含多行字段。

标签: python csv count


【解决方案1】:

如果您必须解析 CSV(例如,由于字段中存在换行符或注释掉的行),但 CSV 太大而无法一次容纳所有内存,您可以逐个解析 CSV -片:

import pandas as pd
import os
import sys

csv.field_size_limit(sys.maxsize)  # increase the maximal line length in pd.read_csv()

cnt = 0
for chunk in pd.read_csv(filepath, chunksize=10**6):
    cnt += len(chunk)
print(cnt)

【讨论】:

    【解决方案2】:

    如果你在 Unix 系统上工作,最快的方法是下面的 shell 命令

    cat FILE_NAME.CSV | wc -l
    

    在 Jupyter Notebook 或 iPython 中,您可以将其与 ! 一起使用:

    ! cat FILE_NAME.CSV | wc -l
    

    【讨论】:

      【解决方案3】:

      在使用csv.reader() 方法迭代整个文件后,您可以通过实例变量line_num 读取总行数:

      import csv
      with open('csv_path_file') as f:
          csv_reader = csv.reader(f)
          for row in csv_reader:
              pass
          print(csv_reader.line_num)
      

      引用the official documentation:

      csvreader.line_num

      从源迭代器读取的行数。

      小警告:

      • 总行数,包括标题(如果 CSV 有)。

      【讨论】:

        【解决方案4】:

        可能想在命令行中尝试如下简单的操作:

        sed -n '$=' filename
        

        wc -l filename
        

        【讨论】:

        • 如果双引号中有换行符怎么办?这仍应被视为同一记录的一部分。这个答案是错误的
        【解决方案5】:

        您也可以使用经典的 for 循环:

        import pandas as pd
        df = pd.read_csv('your_file.csv')
        
        count = 0
        for i in df['a_column']:
            count = count + 1
        
        print(count)
        

        【讨论】:

        • 如果您将其作为 DataFrame 阅读,则不需要循环,您只需 len(df)
        【解决方案6】:
        import pandas as pd
        data = pd.read_csv('data.csv') 
        totalInstances=len(data)
        

        【讨论】:

          【解决方案7】:

          我认为我们可以稍微改进一下最佳答案,我正在使用:

          len = sum(1 for _ in reader)
          

          此外,我们不应该忘记 pythonic 代码并不总是在项目中具有最佳性能。例如:如果我们可以在同一个数据集中同时进行更多操作,最好在同一个 bucle 中完成所有操作,而不是制作两个或多个 pythonic bucle。

          【讨论】:

          • 当然是 a 最快的解决方案。我建议重命名 len 变量,因为它会覆盖内置函数。
          【解决方案8】:

          试试

          data = pd.read_csv("data.csv")
          data.shape
          

          在输出中您可以看到类似 (aa,bb) 的内容,其中 aa 是行数

          【讨论】:

          • 只是偶然发现了一些东西,看起来这个形状评论还不错,实际上比较快:stackoverflow.com/questions/15943769/…
          • 哦,但你会想做一个data.shape[0]
          • 但与@martijnpieters 的答案相比,它是否相对较快,后者使用标准文件句柄/迭代器,并且不需要安装和导入熊猫库?
          【解决方案9】:

          要做到这一点,你需要有一些代码,就像我的例子一样:

          file = open("Task1.csv")
          numline = len(file.readlines())
          print (numline)
          

          希望对大家有所帮助。

          【讨论】:

          • 我喜欢这个简短的答案,但它比 Martijn Pieters 的要慢。对于 10M 行,%time sum(1 for row in open("df_data_raw.csv")) 花费 4.91 秒,而 %time len(open("df_data_raw.csv").readlines()) 花费 14.6 秒。
          • 问题的原始标题(“计算 CSV Python 中有多少行”)措辞令人困惑/误导,因为提问者似乎想要行数/记录数。您的答案会在任何包含换行符字段的数据集中给出错误的行数
          【解决方案10】:

          2018-10-29 编辑

          感谢cmets。

          我测试了几种代码来获取 csv 文件中的行数在速度方面。最好的方法如下。

          with open(filename) as f:
              sum(1 for line in f)
          

          这是测试的代码。

          import timeit
          import csv
          import pandas as pd
          
          filename = './sample_submission.csv'
          
          def talktime(filename, funcname, func):
              print(f"# {funcname}")
              t = timeit.timeit(f'{funcname}("{filename}")', setup=f'from __main__ import {funcname}', number = 100) / 100
              print('Elapsed time : ', t)
              print('n = ', func(filename))
              print('\n')
          
          def sum1forline(filename):
              with open(filename) as f:
                  return sum(1 for line in f)
          talktime(filename, 'sum1forline', sum1forline)
          
          def lenopenreadlines(filename):
              with open(filename) as f:
                  return len(f.readlines())
          talktime(filename, 'lenopenreadlines', lenopenreadlines)
          
          def lenpd(filename):
              return len(pd.read_csv(filename)) + 1
          talktime(filename, 'lenpd', lenpd)
          
          def csvreaderfor(filename):
              cnt = 0
              with open(filename) as f:
                  cr = csv.reader(f)
                  for row in cr:
                      cnt += 1
              return cnt
          talktime(filename, 'csvreaderfor', csvreaderfor)
          
          def openenum(filename):
              cnt = 0
              with open(filename) as f:
                  for i, line in enumerate(f,1):
                      cnt += 1
              return cnt
          talktime(filename, 'openenum', openenum)
          

          结果如下。

          # sum1forline
          Elapsed time :  0.6327946722068599
          n =  2528244
          
          
          # lenopenreadlines
          Elapsed time :  0.655304473598555
          n =  2528244
          
          
          # lenpd
          Elapsed time :  0.7561274056295324
          n =  2528244
          
          
          # csvreaderfor
          Elapsed time :  1.5571560935772661
          n =  2528244
          
          
          # openenum
          Elapsed time :  0.773000013928679
          n =  2528244
          

          总之,sum(1 for line in f) 是最快的。但可能与len(f.readlines()) 没有显着差异。

          sample_submission.csv 大小为 30.2MB,包含 3100 万个字符。

          【讨论】:

          • 您也应该关闭文件吗?节省空间?
          • 为什么你更喜欢 sum() 而不是 len() 在你的结论中? Len() 的结果更快!
          • 不错的答案。一个补充。虽然速度较慢,但​​当 CSV 应该包含根据rfc4180 的有效引用换行符时,应该更喜欢for row in csv_reader: 解决方案。 @dixhom 你测试的文件有多大?
          • 不错的一个。如果文件以'rb' 打开,sum1forline 可能会更快。
          【解决方案11】:

          这适用于 csv 和所有在基于 Unix 的操作系统中包含字符串的文件:

          import os
          
          numOfLines = int(os.popen('wc -l < file.csv').read()[:-1])
          

          如果 csv 文件包含字段行,您可以从上面的 numOfLines 中扣除一个:

          numOfLines = numOfLines - 1
          

          【讨论】:

          • 这对于集成到 python 脚本非常方便。 +1
          【解决方案12】:

          row_count = sum(1 for line in open(filename)) 为我工作。

          注意:sum(1 for line in csv.reader(filename)) 似乎在计算第一行的长度

          【讨论】:

          • 第一个是计算文件中的行数。如果您的 csv 在字符串中有换行符,则不会显示准确的结果
          【解决方案13】:

          首先你必须用 open 打开文件

          input_file = open("nameOfFile.csv","r+")
          

          然后使用 csv.reader 打开 csv

          reader_file = csv.reader(input_file)
          

          最后可以用'len'指令取行数

          value = len(list(reader_file))
          

          总代码是这样的:

          input_file = open("nameOfFile.csv","r+")
          reader_file = csv.reader(input_file)
          value = len(list(reader_file))
          

          记住,如果你想重用csv文件,你必须创建一个input_file.fseek(0),因为当你为reader_file使用一个列表时,它会读取所有文件,并且文件中的指针会改变它的位置

          【讨论】:

            【解决方案14】:

            使用“列表”来适应更实用的对象。

            然后你可以数数、跳过、变异直到你的心愿:

            list(fileObject) #list values
            
            len(list(fileObject)) # get length of file lines
            
            list(fileObject)[10:] # skip first 10 lines
            

            【讨论】:

              【解决方案15】:

              你需要统计行数:

              row_count = sum(1 for row in fileObject)  # fileObject is your csv.reader
              

              sum() 与生成器表达式一起使用可以提高计数器的效率,避免将整个文件存储在内存中。

              如果您已经阅读了 2 行,那么您需要将这 2 行添加到总数中;已读取的行数不计算在内。

              【讨论】:

              • 谢谢。这行得通,但我必须先阅读这些行吗?这似乎有点受欢迎?
              • 阅读这些行;这些行不保证是固定大小的,因此计算它们的唯一方法是全部读取。
              • @Escachator:你在哪个平台上?文件中是否有 EOF (CTRL-Z, \x1A) 字符?您是如何打开文件的?
              • @Escachator: 你的文件名有 53 个字符。阅读器接受可迭代或打开的文件对象,但不接受文件名。
              • 请注意,如果您想再次遍历阅读器(例如处理行),那么您需要重置迭代器,并重新创建阅读器对象:file.seek(0) 然后@987654326 @
              【解决方案16】:

              上面的几个建议计算了 csv 文件中的 LINES 数。但是一些 CSV 文件将包含引用的字符串,这些字符串本身包含换行符。 MS CSV 文件通常用 \r\n 分隔记录,但在带引号的字符串中单独使用 \n。

              对于这样的文件,计算文件中的文本行数(由换行符分隔)会产生太大的结果。因此,为了准确计数,您需要使用 csv.reader 来读取记录。

              【讨论】:

                【解决方案17】:
                import csv
                count = 0
                with open('filename.csv', 'rb') as count_file:
                    csv_reader = csv.reader(count_file)
                    for row in csv_reader:
                        count += 1
                
                print count
                

                【讨论】:

                  【解决方案18】:
                  numline = len(file_read.readlines())
                  

                  【讨论】:

                  • file_read 显然是一个 csv.reader() 对象,因此它没有拥有 readlines() 方法。 .readlines() 必须创建一个可能很大的列表,然后您再次将其丢弃。
                  • 当我写这个答案时,主题还没有关于 csv 的信息是 csv 阅读器对象。
                  猜你喜欢
                  • 1970-01-01
                  • 2014-02-22
                  • 2020-08-23
                  • 2013-09-03
                  • 2020-05-17
                  • 2015-10-10
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多