вы бы использовали библиотеку pandas, это простые в использовании структуры данных и инструменты анализа данных для Python.
установка:
на Python 2
pip install pandas
на python 3
pip3 install pandas
код: этот код будет считывать определенные столбцы из вашего файла в кадр данных pandas, а затем применять регулярное выражение к последнему столбцу, а затемсохраните данные в новый файл.
# importing pandas
import pandas as pd
# import re library
import re
# use read_csv method to read your data file
# delimiter='\t' used if your file is tsp (tsv separated values)
# or delim_whitespace=True if your file use multiple white spaces
# or delimiter=r"[ ]{2,}" to use only more than 2 spaces as your last column uses space inside its value, actually we use regex here.
# usecols=[0,1,3,6] to load those columns only
# optionaly give names to your columns if there is no header in your file names=['colA', 'colB')
df = pd.read_csv('yourfile.txt', delimiter=r"[ ]{2,}", usecols=[0,1,3,6], names=['colA', 'colB', 'colC', 'colD'])
# we make our regex pattern here. thanks to @Kristian
pattern = r"\[([^\|]+)"
# define a simple regex function that will called for every value in your last column. or we could supply lambda to pandas apple method.
def regex_func(value):
return re.findall(pattern, value)
# apply regex to last column values
df['colD'] = df['colD'].apply(regex_func)
# print the results
print(df)
# save your dataframe to new file
# index=false to save df without row names
# header=False to save df without columns names
# sep='\t' to make it tab separated values
df.to_csv('yournewfile.csv', sep='\t', index=False, header=False)
, как вы видите с пандами, вы можете использовать только несколько строк кода, без циклов и т. д., чистыми и простыми в обслуживании.
test-drive код:
я копирую и вставляю содержимое выходного файла:
Sun - exst ['STA']
Moon - exst ['SAT']
Mars + exst ['PLAN']
Venus + exst ['PLAN']
Uranus - exst ['UNK', 'SAT', 'BLA']
Mercury + exst ['UNK', 'PLAN']
ссылки:
officialpandas docs:
http://pandas.pydata.org/pandas-docs/stable/
pandas Tutorials:
https://pandas.pydata.org/pandas-docs/stable/getting_started/tutorials.html
https://www.datacamp.com/community/tutorials/pandas-tutorial-dataframe-python
https://www.tutorialspoint.com/python_pandas
обновление:
я заметил, что ваш файл отсутствует (значения, разделенные табуляцией).он использует несколько пробелов.Сначала я подумал, что могу использовать delim_whitespace = True в методе read_csv
df = pd.read_csv('yourfile.txt', delim_whitespace=True, usecols=[0,1,3,6], names=['colA', 'colB', 'colC', 'colD')
Это помогает, когда у вас есть несколько пробелов в качестве разделителя.
, но в качестве последнего столбцаиспользуйте один пробел в своих значениях, и в результате вы получите неожиданные результаты, поэтому правильный способ для правильного разбора столбцов, включенных в последний столбец, заключается в использовании регулярного выражения с разделителем arg, delimiter = r "[] {2,}"
df = pd.read_csv('yourfile.txt', delimiter=r"[ ]{2,}", usecols=[0,1,3,6], names=['colA', 'colB', 'colC', 'colD'])
update2
Я обновляю код в своем ответе, чтобы показать, как легко применять регулярные выражения к столбцу при использовании pandas
простая одна строкабудет применять функцию к каждому значению из вашего последнего столбца
df['colD'] = df['colD'].apply(regex_func)
Я включил в свой код функцию регулярного выражения для удобства чтения, но это также может быть простой лямбда-вызов, подобный этому
df['colD'] = df['colD'].apply(lambda value: re.findall(r"\[([^\|]+)", value))