我有一个管道分隔的文件,它在每6个管道分隔字段后以换行符结束一条记录,如下所示。
uid216|Banana
bunches
nurture|Fail|76|7645|Singer
uid342|Orange
vulture|Pass|56
87|3547|Actor
我使用python中的split函数将文件中的记录转换为字符串列表。
parts = file_str.split('|')
然而,我似乎不明白如何单独使用换行符作为每6个字符串的分隔符。有人能帮帮我吗?
正确的方法可能是使用Python的csv
模块读取分隔文件并从文件中流式传输数据,而不是一次将其全部读取到内存中。当您将整个文件读取为字符串时,您基本上必须对其进行两次迭代。
import csv
def process_file(path):
with open(path, 'r') as file_handle:
reader = csv.Reader(file_handle, delimiter='|')
for row in reader:
# row is a list whose entries are the fields of the delimited row;
# do what you want with it.
单词似乎可以跨越管道之间的多行。
您可以读取整个文件,然后使用一个模式将5倍的pip字符与前面和后面的所有单词进行匹配。
^[^|n]+(?:n?[^|n]+)*(?:|[^|n]+(?:n?[^|n]+)*){5}
解释
^
字符串开始[^|n]+
匹配除|
之外的1+个字符或换行符(?:n?[^|n]+)*
(可选(匹配可选换行符和除|
或换行符之外的1+个字符(?:
非捕获组作为一个整体重复|[^|n]+
匹配|
和除|
之外的1+个字符或换行符(?:n?[^|n]+)*
可选地重复一个可选的换行符和除|
或换行符之外的1+个字符
){5}
关闭非捕获组并重复5次以匹配5个管道字符
Regex演示
例如
import re
file = open('file', mode='r')
allText = file.read()
pattern = r"^[^|n]+(?:n?[^|n]+)*(?:|[^|n]+(?:n?[^|n]+)*){5}"
file.close()
for s in re.findall(pattern, allText, re.M):
print(s.split("|"))
输出
['uid216', 'Banananbunchesnnurture', 'Fail', '76', '7645', 'Singer']
['uid342', 'Orangenvulture', 'Pass', '56n87', '3547', 'Actor']
如果后面必须有2个换行符或字符串末尾:
^[^|n]+(?:n?[^|n]+)*(?:|[^|n]+(?:n?[^|n]+)*){5}(?=nn|Z)
Regex演示
parts = []
#iterate over each line by using split on n
# extend to gather all strings in a single list
for line in file_str.split("n"):
parts.extend(line.split("|"))
print(parts)