我知道有关如何从文本文件中提取数字的问题,这些问题已经有所帮助。这是我的问题。我有一个文本文件,如下所示:
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"
这成功地将两个数字块放入一个文件中。但是我需要它将一个块放在一个文件中,另一个块放在另一个文件中,而我却失去了如何实现这个目标。
答案 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
返回一个列表。您可以轻松地将列表的每个内容放在一个新文件中。