python - 在 Pandas 中重复后正确拆分 CSV 文件
问题描述
我有包含 5000 行的 CSV,每隔几百行 CSV 行就有一个重复部分。
将这个文件分成几个不同的最有效的选择是什么?
文件看起来像
Header1
number of Samples1
Content1
a1, aa1, aaa1
b1, bb1, bbb1
....
Header2
number of Samples2
Content2
a2, aa2, aaa2
b2, bb2, bbb2
....
Header3
number of Samples3
Content3
a3, aa3, aaa3
b3, bb3, bbb3
我需要将它分成几个文件Header
。我不知道我该怎么做。我编写了整个脚本来处理一些生物材料,但是其中一种文件类型(上图)会产生问题,因为它是多个文件合二为一。并且脚本不想使用它。
我已经阅读了很多关于拆分文件的内容,但是在 Pandas 中重复值后,我没有发现任何关于拆分的信息。
在这种情况下,它将是 3 个文件(但文件中这些文件的数量会有所不同)
解决方案
正如我在评论中建议的那样,我找到了比break
陈述更好的解决方案:
您可以创建result
列表并将每个块数据存储在列表的单独元素中(例如,在 dict 中)。如果您读取非Header行,则可以保证您刚刚读取的行与当前数据块相关。当前的数据块是result
列表中的最后一个元素,因此您可以对其进行修改。如果您阅读Header行,您只需将新元素附加到result
并开始将新的块数据写入其中。
如果内容的大小是恒定的,您可以使用itertools.cycle
将“编码”您的解析过程的迭代器:
from itertools import cycle
text1 = """Header1
number of Samples1
Content1
a1, aa1, aaa1
b1, bb1, bbb1
Header2
number of Samples2
Content2
a2, aa2, aaa2
b2, bb2, bbb2"""
size = 5
iterator = cycle(range(size))
result = []
for line in text1.split('\n'):
i = next(iterator)
if i == 0:
result.append({'header': line})
elif i == 1:
result[-1]['num_of_samples'] = line
elif i == 2:
result[-1]['content_header'] = line
elif i == 3:
result[-1]['content'] = [line.split(', ')]
else:
result[-1]['content'].append(line.split(', '))
如果您不知道内容的大小,则应解析每一行,检查其类型并手动构建数据:
text2 = """Header1
number of Samples1
Content1
a1, aa1, aaa1
b1, bb1, bbb1
b1, bb1, bbb1
Header2
number of Samples2
Content2
b2, bb2, bbb2
Header3
number of Samples3
Content3
a3, aa3, aaa3
b3, bb3, bbb3"""
result = []
i = 0
for line in text2.split('\n'):
if line.startswith('Header'): # Your condition for headers
result.append({'header': line})
elif line.startswith('number'): # Your condition for number of samples
result[-1]['num_of_samples'] = line
elif line.startswith('Content'): # Your condition for content headers
result[-1]['content_header'] = line
else:
if 'content' not in result[-1]: # We don't know is the content list created
result[-1]['content'] = [line.split(', ')]
else:
result[-1]['content'].append(line.split(', '))
推荐阅读
- reactjs - Azure B2C - MSAL - 根据权限从浏览器中清除令牌
- c# - 使用 Dynamic.Linq 在非泛型可查询对象上左连接多个属性的可查询对象
- python-3.x - 如何在Python中遍历十进制数的元素
- java - gradlew publish 给出错误,无法在我的仓库中创建副本
- azure-storage-account - Azure 存储帐户定价
- docker - 存储库和标签名称
在 go 的 docker 图像中 - python - 如何在python中随机运行和停止线程?
- python - 如何在 Python 用户输入中添加符号,以及在创建的文件中时
- python - 使用 fake_user 代理,未导入元素
- sql - SQL查询拆分由对组成的长字符串