在 Python 中读取包含多个 space 作为分隔符的 txt 文件
Reading txt file with more than one space as a delimiter in Python
我有一个文本文件,其中 列被多个 space 分隔。问题是每一列的值也可以被分隔,但最多只有一个space。所以它可能看起来像这样
aaaxx 123 A xyz 456 BB
zcbb a b XYZ xtz 1
cdddtr a 111 tddw
有什么方法可以阅读这样的table吗?我尝试了几种方法,我认为我必须使用某种正则表达式作为分隔符,但老实说我不知道如何解决这个问题。
您可能想使用正则表达式
import re
content = """aaaxx 123 A xyz 456 BB
zcbb a b XYZ xtz 1
cdddtr a 111 tddw
"""
# Split the content on new lines
rows = content.split("\n")
# Create a 2D list (table) out of the values
table = []
for row in rows:
row_arr = []
# The "[ ]" is the regexp equivalent of "space" and {2,} means 2+
for column in re.split("[ ]{2,}", row):
# If the row is empty, don't add it to the table
if len(row_arr):
table.append(row_arr)
print(table)
其他解决方案,使用pandas
:
import pandas as pd
df = pd.read_csv("your_file.txt", sep=r"\s{2,}", engine="python", header=None)
print(df)
打印:
0 1 2 3
0 aaaxx 123 A xyz 456 BB
1 zcbb a b XYZ xtz 1
2 cdddtr a 111 tddw
这里有两个我会使用的实现。它们基于奇偶校验:由两个 space 分隔的值将由单个 space 分隔的值保持在一起,由偶数个 space 分隔的值被正确分割,并且使用 strip
方法清除不均匀的情况。过滤掉剩余的空字符串。
content = """aaaxx 123 A xyz 456 BB
zcbb a b XYZ xtz 1
cdddtr a 111 tddw"""
def split_file_content(file_content: str) -> list[list[str]]:
"""If you don't like regex"""
return [
[part.strip() for part in row.split(" ") if part]
for row in file_content.split("\n")
]
def split_file_content_loops(file_content: str) -> list[list[str]]:
"""If you don't like regex AND list comprehensions"""
table = []
for row in file_content.split("\n"):
values = []
for part in row.split(" "):
if part:
values.append(part.strip())
table.append(values)
return table
print(split_file_content(content))
print(split_file_content_loops(content))
我有一个文本文件,其中 列被多个 space 分隔。问题是每一列的值也可以被分隔,但最多只有一个space。所以它可能看起来像这样
aaaxx 123 A xyz 456 BB
zcbb a b XYZ xtz 1
cdddtr a 111 tddw
有什么方法可以阅读这样的table吗?我尝试了几种方法,我认为我必须使用某种正则表达式作为分隔符,但老实说我不知道如何解决这个问题。
您可能想使用正则表达式
import re
content = """aaaxx 123 A xyz 456 BB
zcbb a b XYZ xtz 1
cdddtr a 111 tddw
"""
# Split the content on new lines
rows = content.split("\n")
# Create a 2D list (table) out of the values
table = []
for row in rows:
row_arr = []
# The "[ ]" is the regexp equivalent of "space" and {2,} means 2+
for column in re.split("[ ]{2,}", row):
# If the row is empty, don't add it to the table
if len(row_arr):
table.append(row_arr)
print(table)
其他解决方案,使用pandas
:
import pandas as pd
df = pd.read_csv("your_file.txt", sep=r"\s{2,}", engine="python", header=None)
print(df)
打印:
0 1 2 3
0 aaaxx 123 A xyz 456 BB
1 zcbb a b XYZ xtz 1
2 cdddtr a 111 tddw
这里有两个我会使用的实现。它们基于奇偶校验:由两个 space 分隔的值将由单个 space 分隔的值保持在一起,由偶数个 space 分隔的值被正确分割,并且使用 strip
方法清除不均匀的情况。过滤掉剩余的空字符串。
content = """aaaxx 123 A xyz 456 BB
zcbb a b XYZ xtz 1
cdddtr a 111 tddw"""
def split_file_content(file_content: str) -> list[list[str]]:
"""If you don't like regex"""
return [
[part.strip() for part in row.split(" ") if part]
for row in file_content.split("\n")
]
def split_file_content_loops(file_content: str) -> list[list[str]]:
"""If you don't like regex AND list comprehensions"""
table = []
for row in file_content.split("\n"):
values = []
for part in row.split(" "):
if part:
values.append(part.strip())
table.append(values)
return table
print(split_file_content(content))
print(split_file_content_loops(content))