所以我试图让代码逐行读取inFile文本。它必须拆分每一行然后运行检查是否有效。由于某种原因,它只读取最后一行,然后在outFile 00-7141858-X中打印,所以我假设它正在读取每行首先到那里。但它只经历了最后一行的过程?
019-923-3241 818-851-703X 5703781188 031-X287085- 00-7141858-X
我希望outfile看起来像这样
019-923-3241 - valid 818-851-703X - invalid 5703781188 - valid 031-X287085- invalid 00-7141858-X - valid
谢谢!
def pre_process (processed_S):
st = ''
for ch in processed_S:
if ch == '-':
st = st + ''
else:
st = st + ch
return st
def digit_check (processed_S):
digit_nums = '0123456789Xx'
nums = set(digit_nums)
for ch in processed_S:
if not ch in nums:
print ("Invalid ISBN")
return processed_S
def length_check(processed_S):
if len(processed_S) < 10 or len(processed_S) > 10:
print ("Invalid ISBN")
def value_placement (processed_S):
first_nine = '0123456789'
nums2 = set (first_nine)
for ch in range(len(processed_S) - 1):
if not str(ch) in nums2:
print ("Invalid ISBN")
return processed_S
def check_x (processed_S):
last_letter = '0123456789Xx'
nums3 = set (last_letter)
if not str(processed_S[-1]) in nums3:
print ("Invalid ISBN")
return processed_S
def main():
inFile = open ('isbn.txt', 'r')
outFile = open ('isbnOut.txt', 'w')
for line in inFile:
line = line.strip()
processed_S = pre_process (line)
st = digit_check (processed_S)
st2 = length_check (processed_S)
st3 = value_placement (processed_S)
st4 = check_x (processed_S)
count = 0
s2 = []
for i in processed_S:
if i.isdigit():
count += int(i)
s2.append(count)
if i == 'X':
i = '10'
count += int(i)
s2.append(count)
s2_count = 0
for j in s2:
if i.isdigit():
s2_count += int(j)
if s2_count % 11 != 0:
outFile.write(processed_S)
outFile.write(" - Invalid\")
else:
outFile.write(processed_S)
outFile.write(" - valid\n")
inFile.close()
outFile.close()
main()的
答案 0 :(得分:2)
几乎就在那里。您需要写入文件而不是附加。不要忘记换行符。
outFile.write(processed_S)
outFile.write(" - Invalid\n")
答案 1 :(得分:0)
您的代码存在一些问题。您要问的是由于缩进问题。这是代码中从输入文件中读取的循环:
for line in inFile:
line = line.strip()
processed_S = pre_process (line)
这只会在每一行上显示strip
,之后会抛弃结果。 pre_process
调用仅在循环结束后完成,并且仅在line
给出的最后一个值上发生。
要解决此问题,您需要缩进processed_S = preprocess (line)
行以及以下大多数行,以便它们与line = line.strip()
处于同一级别。
其他问题:
如果检查失败,您的各种whatever_check
函数不会执行任何操作(并且可能会打印多次!)。可能你应该让它们返回True
或False
值,而不是打印并返回输入的字符串。
digit_check
或value_placement
中的一个也会失败, check_x
才会失败。可能没有必要全部三个(要么保留后两个,要么只做一个测试一切的功能)。像all(c in digits for c in s[:-1]) and s[-1] in (digits + 'X')
之类的东西会在一行中完成所有测试。
其他不是真的错了,但可以改进的东西:
使用with
语句确保您的文件在完成后关闭,而不是依赖于您自己的手动close
来电。
with open ('isbn.txt', 'r') as infile, open ('isbnOut.txt', 'w') as outfile:
# the rest
可以简化您添加ISBN校验和的循环:
checksum = t = 0
for c in processed_S:
if c.isdigit():
t += int(c)
else: # c must be X, or a previous test should have failed
t += 10
checksum += t
if checksum % 11 == 0:
# valid
校验和测试可能与main
的单独函数有关。此外,它应该从更高级valid_isbn
函数调用它和有效性的其他测试,该函数负责预处理和所有检查。这样可以大大简化main
。理想情况下:
def main():
with open ('isbn.txt', 'r') as infile, open ('isbnOut.txt', 'w') as outfile:
for line in infile:
if verify_isbn(line):
outfile.write(line.strip() + " - valid\n")
else:
outfile.write(line.strip() + " - invalid\n")
答案 2 :(得分:-1)
def pre_process(processed_S): st ='' for processing in processed_S: 如果ch ==' - ': st = st +'' 其他: st = st + ch 返回st
def digit_check(processed_S): digit_nums ='0123456789Xx' nums = set(digit_nums) for processing in processed_S: 如果不是在nums中: 打印(“无效的ISBN”) return processed_S
def length_check(processed_S): 如果len(processed_S)&lt; 10或len(processed_S)&gt; 10: 打印(“无效的ISBN”)
def value_placement(processed_S): first_nine ='0123456789' nums2 = set(first_nine) for ch in range(len(processed_S) - 1): 如果不是nums2中的str(ch): 打印(“无效的ISBN”) return processed_S
def check_x(processed_S): last_letter ='0123456789Xx' nums3 = set(last_letter) 如果不是nums3中的str(processed_S [-1]): 打印(“无效的ISBN”) return processed_S
def main():
inFile = open ('isbn.txt', 'r')
outFile = open ('isbnOut.txt', 'w')
for line in inFile:
line = line.strip()
processed_S = pre_process (line)
st = digit_check (processed_S)
st2 = length_check (processed_S)
st3 = value_placement (processed_S)
st4 = check_x (processed_S)
count = 0
s2 = []
for i in processed_S:
if i.isdigit():
count += int(i)
s2.append(count)
if i == 'X':
i = '10'
count += int(i)
s2.append(count)
s2_count = 0
for j in s2:
if i.isdigit():
s2_count += int(j)
if s2_count % 11 != 0:
outFile.write(processed_S)
outFile.write(" - Invalid\n")
else:
outFile.write(processed_S)
outFile.write(" - valid\n")
inFile.close()
outFile.close()
main()的