【问题标题】:Open a csv.gz file in Python and print first 100 rows在 Python 中打开一个 csv.gz 文件并打印前 100 行
【发布时间】:2016-09-22 17:55:39
【问题描述】:

我试图只获取 Python 中包含超过 400 万行的 csv.gz 文件的前 100 行。我还想要关于列数和每个列的标题的信息。我怎样才能做到这一点?

我查看了python: read lines from compressed text files 以了解如何打开文件,但我正在努力弄清楚如何实际打印前 100 行并获取有关列中信息的一些元数据。

我找到了这个Read first N lines of a file in python,但不确定如何将它与打开 csv.gz 文件并在不保存未压缩的 csv 文件的情况下读取它结合起来。

我已经写了这段代码:

import gzip
import csv
import json
import pandas as pd


df = pd.read_csv('google-us-data.csv.gz', compression='gzip', header=0,    sep=' ', quotechar='"', error_bad_lines=False)
for i in range (100):
print df.next() 

我是 Python 新手,我不明白结果。我确定我的代码是错误的,我一直在尝试调试它,但我不知道要查看哪个文档。

我得到了这些结果(并且它一直在控制台中 - 这是一个摘录):

Skipping line 63: expected 3 fields, saw 7
Skipping line 64: expected 3 fields, saw 7
Skipping line 65: expected 3 fields, saw 7
Skipping line 66: expected 3 fields, saw 7
Skipping line 67: expected 3 fields, saw 7
Skipping line 68: expected 3 fields, saw 7
Skipping line 69: expected 3 fields, saw 7
Skipping line 70: expected 3 fields, saw 7
Skipping line 71: expected 3 fields, saw 7
Skipping line 72: expected 3 fields, saw 7

【问题讨论】:

  • 如果您知道how to ask,您将更快地获得帮助。你写了什么代码,它是如何让你失望的?
  • 好的,我更新了我的帖子。想法?
  • 你能发布原始文件的样例吗? (例如,在终端中尝试head filename
  • Pandas 使用元数据作为列。您需要忽略包含列名的行之前的行

标签: python csv


【解决方案1】:

几乎你已经完成了,除了read_csv 也有nrows,你可以从数据集中指定你想要的行数。

此外,为防止出现错误,您可以将error_bad_lines 设置为False。您仍然会收到警告(如果这让您感到困扰,请将 warn_bad_lines 也设置为 False)。这些用于表明数据集的填写方式不一致。

import pandas as pd
data = pd.read_csv('google-us-data.csv.gz', nrows=100, compression='gzip',
                   error_bad_lines=False)
print(data)

您可以使用 csv 内置库轻松执行类似操作,但它需要 for 循环来迭代数据,如其他示例所示。

【讨论】:

    【解决方案2】:

    我认为你可以做这样的事情(来自 gzip 模块 examples

    import gzip
    with gzip.open('/home/joe/file.txt.gz', 'rb') as f:
        header = f.readline()
        # Read lines any way you want now. 
    

    【讨论】:

      【解决方案3】:

      您链接的第一个答案建议使用gzip.GzipFile - 这会为您提供一个类似文件的对象,可以即时为您解压缩。

      现在您只需要某种方法来从类似文件的对象中解析出 csv 数据……例如 csv.reader

      csv.reader 对象将为您提供字段名称列表,因此您可以了解列、它们的名称以及有多少列。

      然后您需要获取前 100 个 csv 行对象,这与您链接的第二个问题中的工作方式完全相同,并且这 100 个对象中的每一个都将是一个字段列表。

      到目前为止,除了知道 library index 中列出的 csv 模块的存在之外,所有这些都包含在您的链接问题中。

      【讨论】:

        【解决方案4】:

        你的代码没问题;

        熊猫read_csv

        warn_bad_lines:布尔值,默认为真

        If error_bad_lines is False, and warn_bad_lines is True, 
        a warning for each “bad line” will be output. (Only valid with C parser).
        

        【讨论】:

          猜你喜欢
          • 2013-09-30
          • 1970-01-01
          • 2015-04-22
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          • 2015-08-12
          • 1970-01-01
          • 2021-02-27
          相关资源
          最近更新 更多