在编写代码后如何添加到文本文件中?

时间:2013-08-09 23:34:44

标签: python-3.x

所以我试图让代码逐行读取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()的

3 个答案:

答案 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()处于同一级别。

其他问题:

  1. 如果检查失败,您的各种whatever_check函数不会执行任何操作(并且可能会打印多次!)。可能你应该让它们返回TrueFalse值,而不是打印并返回输入的字符串。

  2. 只有digit_checkvalue_placement中的一个也会失败,
  3. check_x才会失败。可能没有必要全部三个(要么保留后两个,要么只做一个测试一切的功能)。像all(c in digits for c in s[:-1]) and s[-1] in (digits + 'X')之类的东西会在一行中完成所有测试。

  4. 其他不是真的错了,但可以改进的东西:

    1. 使用with语句确保您的文件在完成后关闭,而不是依赖于您自己的手动close来电。

      with open ('isbn.txt', 'r') as infile, open ('isbnOut.txt', 'w') as outfile:
          # the rest
      
    2. 可以简化您添加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
      
    3. 校验和测试可能与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()的