破損ファイルの復旧 pythonスクリプト version 3

2019/11/18 15:12 by yamasyuh68
  :追加された部分   :削除された部分
(差分が大きい場合、文字単位では表示しません)
破損ファイルの復旧 pythonスクリプト
191116
# 単純コピースクリプト

- ほげった
- HDが妖しくなてきので換装、同期を取っていたら特定のファイルでソフトが反応しなくなった
大きな動画、強制終了してその動画を再生してみたら止まる箇所があり、多分同じ場所だと思う
しかしシークして飛ばすとまた再生される
動画が止まった部分のHDのセクタが不良で読み取れないのだと仮定
- で、動画を少しずつ読み込んで書き出すスクリプトを自作
読込がエラーで帰ってきたらそこは0で埋める構想だったが、システムは遅くても結局読み込んでくれたのでエラー処理部分はメッセージ程度しか書いてない


```
import os , sys ,  datetime

fname = r'<target--fullpath>'
out= r'<out--fullpath>'

size = os.path.getsize( fname )
volume = 1024  # 1024 64 8

try:
    size2 = os.path.getsize( out )
except:
    size2 = 0

fr=open( out , 'ab' )
f = open( fname , 'rb')

for i in range( size2 , size , volume ) :

    sys.stdout.write( f'\r {i:,} / {size:,}  --- {datetime.datetime.now()}' )
    sys.stdout.flush()

    f.seek( i )
    try :
        data = f.read( volume )
        fr.write( data )
    except :
        print(f'\r\n error --- position {i:,}')

f.close()
fr.close()

input( '\r\n finished ---- press any key ......' )
```

# スレッド化してコピー速度監視

```
import os , sys , time , threading

pos = 0
size = 0
flag = False

def copy():

    ##### ここにデータを書く ##########################
    fname = r'<target--fullpath>'
    out= r'<out--fullpath>'

    global size
    size = os.path.getsize( fname )
    volume = 1024  ########### 1024 64 8  数字を小さくするほど遅い
    
    try:
        size2 = os.path.getsize( out )
    except:
        size2 = 0
    
    fr=open( out , 'ab' )
    f = open( fname , 'rb')

    for i in range( size2 , size , volume ) :
        global pos
        pos = i
        f.seek( i )
        try :
            data = f.read( volume )
            fr.write( data )
        except :
            print(f'\r\n error --- position {i:,}')
    
    f.close()
    fr.close()
    global flag
    flag = True


thread = threading.Thread(target = copy )
thread.start()

pos2=0
count=0
while 1:
    if(flag):
        break
    if pos2==pos:
        count+=1
    else:
        count=0
    sys.stdout.write( f'\r{pos:,} / {size:,}--{count} ' )
    sys.stdout.flush()
    pos2=pos
    time.sleep(1)

input( '\r\n finished ---- press any key ......' )
```

---
 --> [その他もろもろの開発](https://mimemo.io/m/p5be8G9RdeoWxkE)      

191116

単純コピースクリプト

  • HDが妖しくなってきたので換装、同期を取っていたら特定のファイルでソフトが反応しなくなった
    大きな動画、強制終了してその動画を再生してみたら止まる箇所があり、多分同じ場所だと思う
    しかしシークして飛ばすとまた再生される
    動画が止まった部分のHDのセクタが不良で読み取れないのだと仮定
  • で、動画を少しずつ読み込んで書き出すスクリプトを自作
    読込がエラーで帰ってきたらそこは0で埋める構想だったが、システムは遅くても結局読み込んでくれたのでエラー処理部分はメッセージ程度しか書いてない
import os , sys ,  datetime

fname = r'<target--fullpath>'
out= r'<out--fullpath>'

size = os.path.getsize( fname )
volume = 1024  # 1024 64 8

try:
    size2 = os.path.getsize( out )
except:
    size2 = 0

fr=open( out , 'ab' )
f = open( fname , 'rb')

for i in range( size2 , size , volume ) :

    sys.stdout.write( f'\r {i:,} / {size:,}  --- {datetime.datetime.now()}' )
    sys.stdout.flush()

    f.seek( i )
    try :
        data = f.read( volume )
        fr.write( data )
    except :
        print(f'\r\n error --- position {i:,}')

f.close()
fr.close()

input( '\r\n finished ---- press any key ......' )

スレッド化してコピー速度監視

import os , sys , time , threading

pos = 0
size = 0
flag = False

def copy():

    ##### ここにデータを書く ##########################
    fname = r'<target--fullpath>'
    out= r'<out--fullpath>'

    global size
    size = os.path.getsize( fname )
    volume = 1024  ########### 1024 64 8  数字を小さくするほど遅い
    
    try:
        size2 = os.path.getsize( out )
    except:
        size2 = 0
    
    fr=open( out , 'ab' )
    f = open( fname , 'rb')

    for i in range( size2 , size , volume ) :
        global pos
        pos = i
        f.seek( i )
        try :
            data = f.read( volume )
            fr.write( data )
        except :
            print(f'\r\n error --- position {i:,}')
    
    f.close()
    fr.close()
    global flag
    flag = True


thread = threading.Thread(target = copy )
thread.start()

pos2=0
count=0
while 1:
    if(flag):
        break
    if pos2==pos:
        count+=1
    else:
        count=0
    sys.stdout.write( f'\r{pos:,} / {size:,}--{count} ' )
    sys.stdout.flush()
    pos2=pos
    time.sleep(1)

input( '\r\n finished ---- press any key ......' )

--> その他もろもろの開発