

python勉強中の初心者です。  
勉強の為にベーシック認証のかかっているWebサーバから数百メガから数ギガのデータとMD5をダウンロードし、そのハッシュ値を計算するプログラムを書いています。  
初心者の為、正規表現等はなるべくせずに可読性を重視して書きました。  
尚、MD5はハッシュ値が32文字続いた後にファイル名が入っている為、先頭から32文字を抜き出しています。

最大でも1200秒あればプログラムのダウンロードは完了するのですが、実際には1200秒待って実行されているようには見えませんでした。  
どのようにしてエラー解消もしくはプログラムの改良をすれば良いでしょうか。

[code]

    import urllib.request 
    import base64 
     
    user = 'abc'
    password = '123'
    basic_user_and_pasword = base64.b64encode('{}:{}'.format(user, password).encode('utf-8'))
    
    url = "http://nanashi/abcde.iso"
    request = urllib.request.Request(url, 
        headers={"Authorization": "Basic " + basic_user_and_pasword.decode('utf-8')})
     
    with urllib.request.urlopen(request) as res:
        data = res.read()
     
    with open('abcde', 'wb') as f:
          f.write(data)
            
    url = "http://nanashi/abcde.iso.md5"
    request = urllib.request.Request(url, 
        headers={"Authorization": "Basic " + basic_user_and_pasword.decode('utf-8')})
     
    with urllib.request.urlopen(request) as res:
        data = res.read()
     
    with open('abcde.iso.md5', 'wb') as f:
          f.write(data)
    
    import time
    
    time.sleep(1200)
    
    
    import hashlib
    with open("abcde.iso", "rb") as f:
        file_hash = hashlib.md5()
        while chunk := f.read(8192):
            file_hash.update(chunk)
    print(file_hash.digest())
    print(file_hash.hexdigest()) 
    
    path1 = "abcde.iso.md5"
    
    file1 = open(path1,'r',encoding='utf-8')
    
    f1 = file1.read()
    f2 = print (f1[0:32]) 
    
    file1.close()
    
    print(f2 == filechecksum)
    
[/code]

エラー内容

[code]

        while chunk := f.read(8192):
                     ^
    SyntaxError: invalid syntax
    
[/code]


CC BY-SA 4.0
2020-11-19T12:01:57.697
72074
2023-07-27T15:07:35.907
2020-11-19T12:28:35.243
3060
31472
question
python python3
read でのファイル読み込みでエラー: SyntaxError: invalid syntax


@metropolis
さんがコメントされたように、使っているPythonの版数が3.8以上でサポートされている記法です。Python版数をチェックしてください。  
あとドキュメントにもあるように、読み取ったデータが空なのかどうかの判定を明確に記述しておいた方が良いかもしれません。

[What's New In Python 3.8](https://docs.python.org/ja/3/whatsnew/3.8.html)

> この記事では 3.7 と比較した Python 3.8 の新機能を解説します。全詳細については changelog をご覧ください。  
>  概要 -- リリースハイライト  
>  新しい機能

[代入式](https://docs.python.org/ja/3/whatsnew/3.8.html#assignment-expressions)

> 大きな構文の一部として、変数に値を割り当てる新しい構文 := が追加されました。 この構文は セイウチの目と牙
> に似ているため、「セイウチ演算子」の愛称で知られています。
>
> この演算子は、生成した値をループ終了の判定とループ本体の両方で使用するような while 文においても、有用です:
[code]

>     # Loop over fixed length blocks
>     while (block := f.read(256)) != '':
>         process(block)
>  
[/code]


CC BY-SA 4.0
2020-11-19T12:23:30.007
72075
2020-11-19T12:23:30.007
26370
72074
answer