gpt4 book ai didi

python - 如何根据特殊条件去除文本文件每一行中的变量空间 - Python 中的单行?

转载 作者:太空宇宙 更新时间:2023-11-03 13:52:49 24 4
gpt4 key购买 nike

我有一些数据(文本文件)以人们能想到的最不均匀的方式格式化。我正在尝试最大程度地减少解析此数据的手动工作量。

示例数据:

Name        Degree      CLASS       CODE        EDU     Scores
--------------------------------------------------------------------------------------
John Marshall CSC 78659944 89989 BE 900
Think Code DB I10 MSC 87782 1231 MS 878
Mary 200 Jones CIVIL 98993483 32985 BE 898
John G. S Mech 7653 54 MS 65
Silent Ghost Python Ninja 788505 88448 MS Comp 887

条件:

  • 应该将一个以上的空格压缩为一个分隔符(管道更好?最终目标是将这些文件存储在数据库中)。
  • 除第一列外,其他列中没有任何空格,因此所有这些空格都可以压缩到管道中。
  • 只有第一列可以有多个带空格的单词 (Mary K Jones)。其余的列主要是数字和一些字母。
  • 第一列和第二列都是字符串。它们之间几乎总是有一个以上的空格,所以这就是我们区分两列的方式。 (如果只有一个空格,考虑到可怕的格式,我愿意冒这个风险!)。
  • 列数各不相同,因此我们不必担心列名。我们只想提取每一列的数据。

希望我说得有道理!我有一种感觉,这个任务可以在一个 oneliner 中完成。我不想循环,循环,循环:(

非常感谢“Pythonistas”,感谢您一路阅读,没有在这句话之前放弃!

最佳答案

在我看来,您的文件中仍然存在某种格式:

>>> regex = r'^(.+)\b\s{2,}\b(.+)\s+(\d+)\s+(\d+)\s+(.+)\s+(\d+)'
>>> for line in s.splitlines():
lst = [i.strip() for j in re.findall(regex, line) for i in j if j]
print(lst)


[]
[]
['John Marshall', 'CSC', '78659944', '89989', 'BE', '900']
['Think Code DB I10', 'MSC', '87782', '1231', 'MS', '878']
['Mary 200 Jones', 'CIVIL', '98993483', '32985', 'BE', '898']
['John G. S', 'Mech', '7653', '54', 'MS', '65']
['Silent Ghost', 'Python Ninja', '788505', '88448', 'MS Comp', '887']

正则表达式非常简单,您唯一需要注意的是分隔符 (\s) 和分词符 (\b)第一个分隔符。请注意,当行不匹配时,您会得到一个空列表,如 lst。这将是一个读取标志,用于启动下面描述的用户交互。您也可以通过以下方式跳过标题行:

>>> file = open(fname)
>>> [next(file) for _ in range(2)]
>>> for line in file:
... # here empty lst indicates issues with regex

以前的变体:

>>> import re
>>> for line in open(fname):
lst = re.split(r'\s{2,}', line)
l = len(lst)
if l in (2,3):
lst[l-1:] = lst[l-1].split()
print(lst)

['Name', 'Degree', 'CLASS', 'CODE', 'EDU', 'Scores']
['--------------------------------------------------------------------------------------']
['John Marshall', 'CSC', '78659944', '89989', 'BE', '900']
['Think Code DB I10', 'MSC', '87782', '1231', 'MS', '878']
['Mary 200 Jones', 'CIVIL', '98993483', '32985', 'BE', '898']
['John G. S', 'Mech', '7653', '54', 'MS', '65']

另一件事就是让用户决定如何处理有问题的条目:

if l < 3:
lst = line.split()
print(lst)
iname = input('enter indexes that for elements of name: ') # use raw_input in py2k
idegr = input('enter indexes that for elements of degree: ')

嗯,我一直觉得第二个元素可能包含空格,因为你不能这样做:

>>> for line in open(fname):
name, _, rest = line.partition(' ')
lst = [name] + rest.split()
print(lst)

关于python - 如何根据特殊条件去除文本文件每一行中的变量空间 - Python 中的单行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3874117/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com