【问题标题】:Loop Not Functioning well循环运行不正常
【发布时间】:2020-12-18 03:44:27
【问题描述】:

各位,我的代码有点问题。该代码应该检查数字列表并将它们分组在基于文本文件提供程序的情况下,但不能按预期工作。它只为每个提供者在一个文件中保存了一个数字,而不是多个。这是我的代码,如果有人可以帮助我将不胜感激。对不起,如果我的代码太传统了

def main():
     dead = open('invalid_no.txt', 'a+')
     print('-------------------------------------------------------')
     print('-------------------------------------------------------')
     list = input('Your Phone Numbers List : ')

     base_url = "http://apilayer.net/api/validate"

     params = {
         'access_key': '3246123d1d67e385b1d9fa11d0e84959',
         'number': '',
               }

     numero = open(list, 'r')


     for num in numero:
         num = num.strip()
         if num:
             lines = num.split(':')
        
             params['number'] = lines[0]
        
             response = requests.get(base_url, params=params)
             
             print('status:', response.status_code)
             print('-------------------------------------')

             try:                 
                 resp = response.json()
                 print('number:', resp['valid'])
                 print('number:', resp['international_format'])
                 print('country:', resp['country_name'])
                 print('location:',resp['carrier'])
                 print('-------------------------------------')    
                 mok = open(resp['carrier'],'w+')      
                 if resp['carrier'] == mok.name:
                    mok.write(num +'\n')
             except FileNotFoundError:
                 if resp['carrier'] == '':
                    print('skipping')
                 else:
                    mok = open(resp['carrier'],'w+')
                    if resp['carrier'] == mok.name:
                     mok.write(num)
                    else:
                     print('No')
if __name__ == '__main__': main()

【问题讨论】:

  • 使用"w+"文件模式是不可能得到FileNotFoundError的。
  • @OlvinR​​oght 是的,但由于某种原因,我遇到了异常并修复了它,无论如何你认为你可以帮助我处理我的代码

标签: python loops file-handling


【解决方案1】:

以"w" 模式打开文件将删除现有文件并从一个空的新文件开始。这就是为什么你只得到一个数字。每次写入文件时,都会覆盖之前的任何内容。没有模式"w+"。我相信这应该会导致ValueError: invalid mode: 'w+',但实际上它似乎与"w" 一样。 "r+" 存在的事实并不意味着您可以推断出还有一个未记录的"w+"。

来自open() 的文档:

第二个参数是另一个包含几个字符的字符串 描述文件的使用方式。模式可以是'r' 当仅读取文件时,'w' 仅用于写入(现有的 同名文件将被删除),'a' 打开文件 附加;写入文件的任何数据都会自动添加到 结尾。 'r+' 打开文件进行读写。模式 参数是可选的;如果省略'r',则假定为'r'。

所以,没有"w+"。

我想你想要模式 "a" 来追加。但是如果你这样做了,当你的代码第一次尝试写入文件时,它就不会在那里追加,所以你会得到你遇到问题的文件未找到错误。

在写入文件之前,检查它是否存在。如果没有,则打开写入,否则打开附加。

if os.path.exists(resp['carrier']):
    mok = open(resp['carrier'],'a')
else: 
    mok = open(resp['carrier'],'w')

或者,如果你喜欢单线,

mok = open(resp['carrier'],'a' if os.path.exists(resp['carrier']) else 'w')

此外,您的代码在完成写入文件后永远不会在文件上调用close()。这应该。忘记它可能会导致数据丢失或其他令人费解的行为。

不要忘记它的最好方法是使用上下文管理器:

with open(resp['carrier'],'a' if os.path.exists(resp['carrier']) else 'w') as mok:
    # writes within the with-block here
# rest of program here
# after the with-block ends, the context manager closes the file for you.

【讨论】:

  • 感谢您提醒我,我完全忘记了我必须追加而不是覆盖,是的,它有效,下次我会尝试使用尝试使用上下文管理器,所以我不会搞砸整理我的文件。
猜你喜欢
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 2015-05-16
  • 2015-05-08
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2019-12-07
相关资源
最近更新 更多