【问题标题】:How to read one line then jumps three, while in pandas.read_csv(), until the end of the text file?如何在 pandas.read_csv() 中读取一行然后跳三行,直到文本文件的末尾?
【发布时间】:2022-01-15 13:29:39
【问题描述】:

我有一个文本文件,其中包含 800 万行 (like so)。但我只需要使用 pandas.read_csv() 函数读取文件的一些行(在图像中标记为红色)。

我试图做的逻辑是:“读一行,然后跳三行”直到文件末尾,所以我不会使用对我无用的行。

我知道pd.read_csv()函数中有参数skiprows=,但是我不知道如何pythonly把逻辑放在函数的参数中。最后,我将需要一个包含所有文本文件中以下列的数据框:

header = ["Elm Ion","WL_air(A)","log gf*","E_low(eV)", "Waals"]

提前致谢!

【问题讨论】:

  • 使用 python 的 csv 模块代替更精细的控制。如果您正在使用 unix 机器,您可能会使用 grep 来过滤行;我希望它快速/高效

标签: python pandas csv


【解决方案1】:

我同意@sammywemmy 关于 csv 模块进行更精细控制的评论,这将使事情更容易修改和自定义。也就是说,可赎回选项确实引起了我的兴趣,所以这就是你如何做到的。 (请注意,我们必须添加边缘情况来获取列标题和第一行。)

>>> def skip_func(x):
...     if x in (0, 1):
...         return False
...     else:
...         return (x-1) % 4 != 0

>>> pd.read_csv(filepath, skiprows=skip_func)

【讨论】:

  • 谢谢!这工作得非常好。我不习惯 python csv 模块,这是一个“小”的工作,所以谢谢你的回答。
【解决方案2】:

我不了解 Pandas,Python 的 CSV 模块足以胜任这项工作。

另外,你问过如何跳过一定数量的行,我的解决方案就是这样。 但是查看您的数据,我看到一行“数据”,然后是其他一些元数据行(摘要?),这代表了另一种思考您的数据的方式问题。

这是固定跳过的解决方案,之后我将介绍“相对跳过”的解决方案。

固定跳过,或跳过 n 行/行

鉴于此文件,input.csv

id,foo
1,a
2,b
3,c
4,d
5,e
6,f
7,g
8,h
9,i
10,j

当我运行这个时:

#!/usr/bin/env python3
import csv

csv_out = open('output.csv', 'w', newline='')
writer = csv.writer(csv_out)

csv_in = open('input.csv', newline='')
reader = csv.reader(csv_in)

writer.writerow(next(reader))  # if your input CSV has a header

# Loop over rows
for row in reader:
    writer.writerow(row)

    try:
        # next(reader) advances the CSV one row at a time; discard results
        next(reader)
        next(reader)
        next(reader)
    except StopIteration:
        # The expected exception when reader runs out of rows
        break
    except Exception as e:
        # Unexpected, raise it to user's attention
        raise e


csv_in.close()
csv_out.close()

我得到了 output.csv

id,foo
1,a
5,e
9,i

如果你想让跳过可编程:

...
SKIP_ROWS = 3
...
for row in reader:
    try:
        for i in range(SKIP_ROWS):
             next(reader)
    except StopIteration:
    ....

相对跳过,或跳过具有某些属性的行

如果元数据行数发生变化,跳过固定数量的行将会中断。您最好按属性跳过行。

据我所知,数据行和元数据行之间的最大区别在于,数据行有许多字段(列),而元数据行是单个字段。

...
for row in reader:
    if len(row) == 1:  # single column, or some other "attribute" of a row you want to skip
        continue       # skip it

    # process your real data
    ...

【讨论】:

  • 嗯.... 这比我想象的要复杂得多。由于我不习惯使用 python csv 模块,所以我坚持使用@Maksim 的答案。但我想了解更多关于这个模块的信息,所以我真的认为你的回答会对我有所帮助。所以...谢谢!
  • 酷,如果有帮助请投票。
  • 哦,我投了赞成票,但我认为我没有足够的声誉来做这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多