我遇到了一个分配问题,我需要编写一个程序,在我的计算机上打开一个文件,并扫描该文件以查找数字的第一个实例。一旦找到它将返回
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 + "."
答案 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)
使用<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}}