python只读取文件中的整数

时间:2016-11-27 16:50:04

标签: python

我无法想象从这个文件中读取的方式,只有整数:

34
-1
2 48
  +0
++2
+1
 2.4
1000
-0
three
-1  

该函数应该返回:

[34, -1, 0, 1, -1]

如果某个号码+-有效。但如果它有++或任何字母不是。

如果它有空格(例如2 48)则无效。

如果是> 999无效。

我只被困在这里:

my_list = []
with open('test.txt') as f:
    lines = f.readlines()
    for line in lines:
        my_list.append(line.strip())

我尝试将其设为字符串并使用translate使用标点符号,但我不确定它是否会变得更复杂。

另外,我不确定使用正则表达式。我尝试了一个简单的正则表达式,但我没有使用它的经验。

5 个答案:

答案 0 :(得分:7)

您可以使用int()将字符串转换为整数。如果string不是整数,它将抛出ValueError。所以试试这个:

my_list = []
with open('test.txt') as f:
    for line in f:
        try:
            n = int(line)
            if n > 999 or line.strip() == '-0': continue #filtering numbers >999 and strings with '-0'
            my_list.append(n)
        except ValueError:
            pass

print(my_list)

输出:[34, -1, 0, 1, -1]

答案 1 :(得分:4)

如果你想通过正则表达式这样做:

import re
exp = re.compile(r'^[\+,\-]?[0-9]{1,3}$')

my_list = []
with open('input.txt') as f:
    lines = f.readlines()
    for line in lines:
        if re.match(exp, line.strip()):
            my_list.append(int(line.strip()))

让我们解释正则表达式。

^[\+,\-]? - ^表示表达式必须以下一个限定符开头,这两个限定符是两个字符\+\-的列表。我们需要在那里使用转义斜杠实际放入特殊字符。最后?使前面的参数可选(因此字符串可以以+或 - 开头,或者什么都没有)。

[0-9]{1,3}$ - [0-9]指定数字字符集。 {1,3}指定它们应至少出现一次,或最多出现3次(因此满足<999约束。$符号匹配字符串的结尾,因此字符串必须以这组字符结束。

希望这一切都有所帮助。

答案 2 :(得分:3)

如果您想手动执行此操作(请注意,regex解决方案或调用int可能更合适,但这些已在其他答案中介绍过),那么您也可以自己实施每项检查:

import string

characters_and_whitspaces = set(string.ascii_letters + ' .')

mylist = []

for line in lines:
    # remove leading and trailing whitespaces
    val = line.strip()

    # Check if valid (!= -0)
    if val == '-0':
        continue
    # Must not start with ++, +-, ....
    if val.startswith(('++', '+-', '-+', '--')):
        continue
    # Must not contain letters or whitespaces or a dot
    if characters_and_whitspaces.intersection(val):
        continue
    # Must only contain 3 or less digits (<= 999) or 4 if it starts with + or -
    if val.startswith(('+', '-')):
        if len(val) >= 5):
            continue
    elif len(val) >= 4:
        continue

    # Remove leading "+"
    val = val.lstrip('+')

    mylist.append(val)

答案 3 :(得分:2)

这是一个正则表达式解决方案:

import re

rgx = re.compile(r'^\s*[-+]?\s*(?:0|0*\d{1,3})\s*$', re.M)

with open('test.txt') as f:
    my_list = [int(match) for match in rgx.findall(f.read())]

输出:

[34, -1, 0, 1, 0, -1]

答案 4 :(得分:0)

我认为正则表达式是你的选择。你可以用这样的东西来实现你想要的东西:[-+]?\d*它寻找一个+或 - ,问号意味着可选,然后是任意数量的数字。 为您的案例找到正确的正则表达式的简单方法是https://regex101.com/。您可以直接查看正则表达式匹配的内容,并向您解释。在python中,re模块(https://docs.python.org/2/library/re.html

可以使用常规的exressions

希望这会对你有所帮助。