[英]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.