繁体   English   中英

如何通过字符串和空行读取 csv 的某些行?

[英]How to read certain lines of a csv by a string and empty line?

我正在尝试阅读 CSV 文件,这些文件的列堆叠在一起。 它们看起来像这样:

Body 1
Data_Col_1 Data_Col_2 Data_Col_3
Data_Col_1 Data_Col_2 Data_Col_3
Data_Col_1 Data_Col_2 Data_Col_3
Data_Col_1 Data_Col_2 Data_Col_3

Body 2
Data_Col_1 Data_Col_2 Data_Col_3
Data_Col_1 Data_Col_2 Data_Col_3
Data_Col_1 Data_Col_2 Data_Col_3
Data_Col_1 Data_Col_2 Data_Col_3

我正在尝试编写一个 function ,它将在某个字符串(例如正文 2)之后开始读取 csv 文件,并在遇到空行时停止。

我的代码如下所示:

def csv_strings(filepath, bl_group_n=1, start=str, dtype=str):
with open(filepath, newline='') as f:
    blank_lines = 0
    bl_groups = 0
    contents = []
    headers = None
    r = csv.reader(f)
    for row in r:
        if not row:
            break
        else:
            if bl_groups < bl_group_n:
                if start in row:
                    blank_lines += 1
                    continue
                if blank_lines == 0:
                    continue
                bl_groups += 1
                blank_lines = 0
                headers = row
                continue
            contents.append(row)
    return pd.DataFrame(data=contents, columns=headers, dtype=dtype)

第一部分工作正常。 我可以在包含起始字符串的所需行开始读取 csv。

问题是一旦遇到空行它就不会停止。

到目前为止,我已经尝试过:

if row == '\n'

if row == ['', '', '', '', '', '', '', '', '', '']
# I printed all the rows to see what an empty line looked like in my csv files.

if row == '\r\n'

错误示例如下。 csv 应该在第 28 行停止,但仍在继续。

在此处输入图像描述

编辑1:

所以我做了一些建议的改变。 我不得不使用 isinstance() 而不是 isType() 因为由于某种原因 Python 没有将后者识别为 function。 我还创建了一个名为 row2 的虚拟行来检查空行,因为我不想更改行,因为它也在下面的 else 语句中使用。

现在,output 只是一个空数据框的破折号。 这是否意味着每一行都有一些空白?

在此处输入图像描述

编辑2:

我不知道如何在我的帖子中添加示例 csv 文件。

由于保密问题,我无法发布真实数据。 但是,我有一个类似格式的模型。

我的文件看起来像这样:

在此处输入图像描述

我想要的是我的代码能够提取某些行。

例如,如果我跑

test = csv_strings(filepath = '/Users/mi-okkim/Desktop/Dummy Data.csv', bl_group_n=1, start='Activities', dtype=str)

我的 output 是

在此处输入图像描述

但我希望它是

在此处输入图像描述

本质上,我希望它在读取下一行为空白时停止。

您没有检查的是您实际拥有的“空白行”。 显然,这不是您测试的任何可能性。 如果你想使用一些直接的矫枉过正:

  • 确保该row是单个字符串
  • 去掉空格
  • 将结果与空字符串进行比较

可能的代码:

if isType(row, list):   #If it's a list, join the fields into a single string
    row = ''.join(row)

if not row.strip(" \n\r\t"):
    break

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM