打开文件并读取以查找数字的第一个实例。蟒蛇

时间:2010-12-03 19:16:51

标签: python

我遇到了一个分配问题,我需要编写一个程序,在我的计算机上打开一个文件,并扫描该文件以查找数字的第一个实例。一旦找到它将返回

filenm中的第一个数字是x

否则会说filenm中没有数字。

到目前为止我的代码如下: 当我运行它时,无论它总是说什么都没有数字:(

filenm = raw_input("Enter a file name: ")
datain=open(filenm,"r")

try:
    c=datain.read(1)
    result = []

    for line in datain:
        c=datain.read(1)

        while int(c) >= 0:
            c = datain.read(1)
            result.append(c)


except:
    pass

    if len(result) > 0:
            print "The first number is",(" ".join(result))+" . "
    else:
            print "There is no number in" , filenm + "."

6 个答案:

答案 0 :(得分:2)

这就是你所需要的:

import re

with open("filename") as f:
    for line in f:
        s=re.search(r'\d+',line)
        if s:
            print(s.group())
            break

答案 1 :(得分:1)

  1. 打开文件;
  2. 在循环char-by-char中读取它;
  3. 检查字符是否为数字,打印您想要的内容;
  4. 表示文件中没有数字,如果到达文件末尾,则打印“无数字”
  5. 使用<string>.isdigit()方法检查给定字符串(在您的情况下是单个字符)是否为数字。

答案 2 :(得分:0)

我不建议混合迭代文件

for line in datain:

使用read方法(或任何类似方法)

c=datain.read(1)

坚持一个或另一个。就个人而言,我会在这里进行迭代。

答案 3 :(得分:0)

readlines()方法返回文件中所有行的列表。然后,您可以通过每行中的字符列表进行迭代:

filenm = raw_input("Enter a file name: ")
datain=open(filenm,"r")

try:

    result = []

    for line in datain.readlines():
        print 'line: ' + line
        for each in line:
            try:
                # attempt casting a number to int
                int(each)
                # if it worked it add it to the result list
                result.append(each)
            except:
                pass
except:
    pass

print result
if len(result) > 0:
   print "The first number is",(" ".join(result[0]))+". "
else:
   print "There is no number in" , filenm + "."

这仅适用于它找到的第一个数字字符,不确定您是否确实需要提取多位数字。

答案 4 :(得分:0)

我的想法:

1)正如其他人所说,不要掩盖异常。让它被抛出会更好 - 至少那样你会发现出了什么问题,如果出了什么问题。

2)您执行希望使用for line in file:一次读取一行文件。这样做的原因是你想要阅读的数字基本上是“单词”(用空格分隔的东西),并且没有一种内置的方法可以一次读取一个单词。 file.read(1)读取单个字节(即ASCII文件的字符),然后你必须自己将它们组合成单词,这很乏味。告诉Python将一行分成单词要容易得多。至少,我在这里假设你不应该从“垃圾邮件ham20eggs 10 lobster thermidor”中挑出“20”。

.readlines()有些多余;它可以方便地列出文件中的行 - 但我们不需要该列表;我们一次只需要一条线。有一个名为.xreadlines()的函数定义了它,但它已被弃用 - 因为我们只能使用for line in file:。说真的 - 保持简单。

3)如果输入是非数字的,Python中的int将不会返回负值。它会引发异常。您的代码无法正确处理该异常,因为它会突破循环。没有办法告诉Python“继续从你抛出异常的地方开始” - 而且不应该这样,因为其余的代码应该如何解释发生的事情?

答案 5 :(得分:0)

实际上你的代码并不太远。有很多问题。一个重要的一点就是try/except隐藏了你的错误,这可能有助于你自己解决问题。另一个原因是你一次读取一行一行(并完全忽略其内容)以及一次一个字符。

在你给出一个非数字字符串时,int()函数的作用似乎也存在误解,它的作用是引发异常,而不是返回小于0的东西。 em>可以在try/except中将except封闭一个调用,ValueError专门用于import string filenm = raw_input("Enter a file name: ") datain = open(filenm,"r") # find first sequence of one or more digits in file result = [] while True: c = datain.read(1) while c in string.digits: # digit? result.append(c) c = datain.read(1) if c == "" or len(result) > 0: # end-of-file or a number has been found break # get out of loop if len(result) > 0: print "The first number is'", "".join(result) + "'." else: print "There is no number in'", filenm + "'." close(datain) ,但在这种情况下,提前检查会更容易看看这个角色是否是一个数字,因为你想做的就是继续这样做,直到看不到一个。

因此,这是修改代码以解决上述问题的一种方式:

{{1}}