使用Python从文件中提取数字段?

时间:2015-01-15 16:45:45

标签: python parsing

我知道有关如何从文本文件中提取数字的问题,这些问题已经有所帮助。这是我的问题。我有一个文本文件,如下所示:

Some crap here: 3434
A couple more lines
of crap.
34 56 56
34 55 55
A bunch more crap here
More crap here: 23
And more: 33
54 545 54
4555 55 55

我正在尝试编写一个脚本,用三个数字提取行并将它们放入单独的文本文件中。例如,我有一个文件:

34 56 56
34 55 55

另一个文件:

54 545 54
4555 55 55

现在我有:

for line in file_in:
    try:
        float(line[1])
        file_out.write(line)
    except ValueError:
        print "Just using this as placeholder"

这成功地将两个数字块放入一个文件中。但是我需要它将一个块放在一个文件中,另一个块放在另一个文件中,而我却失去了如何实现这个目标。

3 个答案:

答案 0 :(得分:0)

要知道字符串是否为数字,您可以使用str.isdigit

for line in file_in:
    # split line to parts
    parts = line.strip().split()
    # check all parts are numbers
    if all([str.isdigit(part) for part in parts]):
        if should_split:
            split += 1
            with open('split%d' % split, 'a') as f:
                f.write(line)
            # don't split until we skip a line
            should_split = False
        else:
            with open('split%d' % split, 'a') as f:
                f.write(line)
    elif not should_split:
        # skipped line means we should split
        should_split = True

答案 1 :(得分:0)

您没有指定您正在使用的Python版本,但您可能会在Python2.7中以这种方式处理它。

string.translate采用转换表(可以是None)和要转换的一组字符(如果表为None,则删除)。

您可以通过正确切片string.printable将delete_chars设置为除0-9和空格之外的所有内容:

>>> import string
>>> remove_chars = string.printable[10:-6] + string.printable[-4:]
>>> string.translate('Some crap 3434', None, remove_chars)
'  3434'
>>> string.translate('34 45 56', None, remove_chars)
'34 45 56'

添加strip以修剪左侧和右侧的空白区域并迭代包含您问题数据的测试文件:

>>> with open('testfile.txt') as testfile:
...   for line in testfile:
...     trans = line.translate(None, remove_chars).strip()
...     if trans:
...       print trans
... 
3434
34 56 56
34 55 55
23
33
54 545 54
4555 55 55

答案 2 :(得分:0)

你可以在这里使用正则表达式。但这需要通过file.read()或其他东西将文件读入变量。(如果文件不是很大)

((?:(?:\d+ ){2}\d+(?:\n|$))+)

参见演示。

https://regex101.com/r/tX2bH4/20

import re
p = re.compile(r'((?:(?:\d+ ){2}\d+(?:\n|$))+)', re.IGNORECASE)
test_str = "Some crap here: 3434\nA couple more lines\nof crap.\n34 56 56\n34 55 55\nA bunch more crap here\nMore crap here: 23\nAnd more: 33\n54 545 54\n4555 55 55"

re.findall(p, test_str)

re.findall返回一个列表。您可以轻松地将列表的每个内容放在一个新文件中。