第十二章Pythonファイル操作


12.1 open()
Open()関数は、ファイルを開き、ファイルオブジェクトを返す役割を果たします.
使用方法フォーマット:open(name[,mode[,buffering[,encoding]])->file object
nameファイル名
modeモード、例えば読み取り専用で開く
bufferingバッファ
Encodingはデータがどのような符号化を採用しているかを返し、一般的にutf 8またはgbk
Mode
Description
r
読み取り専用、デフォルト
w
書き込みのみ、開く前にファイルの内容をクリア
a
追加
a+
読み書き
w+
読み取り可能、書き込み可能、ファイルの内容をクリア
r+
読み書き可能で、ファイルのどこにでも書くことができます.
rb
バイナリモードリード
wb
バイナリモード書き込み、ファイル内容のクリア
たとえば、ファイルを開く
>>> f = open('test.txt', 'r')
>>> f.
f.__class__(         f.__new__(           f.encoding           f.readinto(
f.__delattr__(       f.__reduce__(        f.errors             f.readline(
f.__doc__            f.__reduce_ex__(     f.fileno(            f.readlines(
f.__enter__(         f.__repr__(          f.flush(             f.seek(
f.__exit__(          f.__setattr__(       f.isatty(            f.softspace
f.__format__(        f.__sizeof__(        f.mode               f.tell(
f.__getattribute__(  f.__str__(           f.name               f.truncate(
f.__hash__(          f.__subclasshook__(  f.newlines           f.write(
f.__init__(          f.close(             f.next(              f.writelines(
f.__iter__(          f.closed             f.read(              f.xreadlines(

Open()関数は、ファイルを開いてファイルオブジェクトを返し、fを遍歴すると、fはこのファイルオブジェクトの操作方法を有する.
方法
説明
f.read([size])
sizeバイトを読み出し、負の値が指定されていない場合、残りのすべてのバイトを読み出し、文字列として返す
f.readline([size])
ファイルから次の行を読み込み、文字列として返します.sizeを指定するとsizeバイトが返されます
f.readlines([size])
sizeバイトを読み出し、負の値が指定されていない場合、残りのすべてのバイトを読み出し、リストとして返す
f.write(str)
ファイルへの文字列の書き込み
f.writelines(seq)
ファイルにシーケンスを書き込むには、seqは反復可能なオブジェクトであり、文字列シーケンスである必要があります.
f.seek(offset[, whence=0])
ファイル内でファイルポインタを移動し、whence(0はファイルの開始位置、デフォルト.1は現在の位置、2はファイルの末尾)からoffsetバイトをオフセットします.
f.tell()
ファイル内の現在の場所を返します
f.close()
ファイルを閉じる
f.flush
ディスクへのバッファのリフレッシュ
12.2ファイルオブジェクト操作
テストファイルを書きますtxtの例:
# cat test.txt
1.Python
2.Java
3.C++
4.Ruby

12.2.1 read()すべてを読み込む
>>> f = open('test.txt', 'r')
>>> f.read()
'1.Python
2.Java
3.C++
4.Ruby
'

読み込みバイト数を指定します.
>>> f = open('test.txt', 'r')
>>> f.read(9)  #       
'1.Python
'

12.2.2 readline()次の行の内容を読み込む
>>> f = open('test.txt', 'r')
>>> f.readline()
'1.Python
' >>> f.readline() '2.Java
'

12.2.3 readline()すべてのコンテンツを読み込み、リストを返す
>>> f = open('test.txt', 'r')
>>> f.readlines()
['1.Python
', '2.Java
', '3.C++
', '4.Ruby
']

12.2.4 wirte()ファイルへの文字列の書き込み
>>> f = open('test.txt', 'a')  #          
>>> f.write("5.Shell
")  #  >>> f.flush()  #  # cat test.txt 1.Python 2.Java 3.C++ 4.Ruby 5.Shell

12.2.5 wirtelines()シーケンス文字列をファイルに書き込む
>>> f = open('test.txt', 'a')
>>> f.writelines(['a','b','c'])
>>> f.flush()
# cat test.txt
1.Python
2.Java
3.C++
4.Ruby
5.Shell
abc

12.2.6 seek()指定された場所から読み込む
>>> f = open('test.txt', 'r')
>>> f.tell()
0
>>> f.seek(9)
>>> f.tell()
9
>>> f.seek(5,1)  # 1         
>>> f.tell()
14

12.2.7 tell()現在のポインタ位置を返す
>>> f = open('test.txt', 'r')
>>> f.tell()
0
>>> f.readline()
'1.Python
' >>> f.tell()    9 >>> f.readline() '2.Java
' >>> f.tell()    16 >>> f.close()  # 

ブログアドレス:http://lizhenliang.blog.51cto.com
QQ群:323779636(Shell/Python運行メンテナンス開発群)
12.3ファイルオブジェクトの追加削除
shellでは、ファイル指定行に内容を挿入したり、置き換えたりするには、sedツールを使用すると簡単に実現できます.この章で述べるopen()関数はsedツールと直接似たような方法はありませんが、このような操作を実現するには、融通の利いた処理がこの効果を達成するには、まず内容の修正を読み取り、ファイルを書くことを主な考え方とし、以下にいくつかの一般的な状況を挙げます.
12.3.1最初の行に1行追加
たとえば、test文字列を先頭に追加します.
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data = f.read()
data = "test
" + data f = open('test.txt', 'w') f.write(data) f.flush() f.close() # python test.py # cat test.txt test 1.Python 2.Java 3.C++ 4.Ruby

まずデータを読み出し、追加するtest文字列を元のデータにつなぎ、このファイルに書き込みます.
12.3.2指定した行に行を追加
たとえば、2行目にtest文字列を追加します.
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data_list = f.readlines()  #    ,           
# data_list = []
# for line in f:
#     data_list.append(line)
data_list.insert(1, 'test
') # data = ''.join(data) f = open('test.txt', 'w') # f.write(data) f.writelines(data_list)   f.flush() f.close # python test.py # cat test.txt 1.Python test 2.Java 3.C++ 4.Ruby

まずデータをリストに格納すると、下付き文字に基づいて指定された位置、つまりどの行に挿入できます.さらにjoinでリストを文字列につなぎ、最後にファイルに書きます.
12.3.3一致行の前の行または後の行にtest文字列を追加する
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data_list = f.readlines()
data_list.insert(2-1, 'test
')  #  , f = open('test.txt', 'w') f.writelines(data_list) f.flush() f.close

12.3.4指定行の削除
たとえば、3行目を削除し、指定した行に追加するのと同じです.
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data_list = f.readlines()
data_list.pop(2)
f = open('test.txt', 'w')
f.writelines(data_list)
f.flush()
f.close

たとえば、最初の行から3番目の行のみを保持します.
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data_list = f.readlines()[0:2]  #     
f = open('test.txt', 'w')
f.write(data_list)
f.flush()
f.close

12.3.5一致する行の削除
たとえば、Py文字に一致する行を削除します.
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data = f.readlines()
# data_list = []
# for line in data:
#     if line.find('Py') == -1:   #         Py  ,   -1,      
#         data_list.append(line)
data_list = [line for line in data if line.find('Py') == -1]  
f = open('test.txt', 'w')
f.writelines(data_list)
f.flush()
f.close

12.3.6グローバル置換文字列
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data = f.read()
data.replace('old string', 'new string')
f = open('test.txt', 'w')
f.write(data)
f.flush()
f.close

12.3.7指定した行に文字列を置換する
例:C++をC#に変更
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data = f.readlines()
data_list = []
for line in data:
    if data.index(line) == 2:
        data_list.append(line.replace('++', '#'))
    else:
        data_list.append(line)
f = open('test.txt', 'w')
f.writelines(data_list)
f.flush()
f.close

12.3.8大ファイルの処理
Gファイルを読み込むと、すべての内容を直接読み込むとメモリが多すぎてメモリがパンクします.処理効率を向上させるには、次の2つの方法があります.
方法1:open()ファイルを開いて返すオブジェクト自体が反復可能であり、forループ反復により処理性能が向上する
>>> f = open('test.txt')
>>> for line in f:
...   print line   #            
, , line.strip('
') ... 1.Python 2.Java 3.C++ 4.Ruby

方法2:固定バイトのみを読み込む
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt')
while True:
    data = f.read(1024)  #      1024  
    if not data: break

12.3.9ファイルのダウンロード
  1:
import urllib
url = "http://nginx.org/download/nginx-1.10.1.tar.gz"
urllib.urlretrieve(url, "nginx-1.10.1.tar.gz")

  2:
import urllib2
url = "http://nginx.org/download/nginx-1.10.1.tar.gz"
f = urllib2.urlopen(url).read()
with open("nginx-1.10.1.tar.gz", "wb") as data:
    data.write(f)

12.4 fileinput
fileinputモジュールはPython内蔵モジュールで、ファイルを遍歴し、マルチファイルを操作することができます.
方法
説明
fileinput.input([files[, inplace[, backup[, mode[, openhook]]]]])
files:ファイルパス、マルチファイルこう書く['1.txt,'2.txt']inplace:標準出力を元のファイルに書くかどうか、デフォルトは0で、backupを書かない:バックアップファイル拡張子、例えば.bakmode:読み書きモード、デフォルトr、読み取り専用openhook:
fileinput.isfirstline()
現在の行がファイルの最初の行であるかどうかを確認します.
fileinput.lineno()
現在読み込まれているローの数を返します.
fileinput.fileno()
現在のファイル数を返します
fileinput.filelineno()
現在の読み出し行の行番号を返します.
fileinput.filename()
現在のファイル名を返します
12.4.1ファイル内容の遍歴
#!/usr/bin/python
# -*- coding: utf-8 -*-
import fileinput
for line in fileinput.input('test.txt'):
    print line
    
# python test.py 
1.Python
2.Java
3.C++
4.Ruby

12.4.2現在の読取り行の行番号を返す
#!/usr/bin/python
# -*- coding: utf-8 -*-
import fileinput
for line in fileinput.input('test.txt'):
    print fileinput.filelineno()
    print line,  #        
    
# python test.py
1
1.Python
2
2.Java
3
3.C++
4
4.Ruby

12.4.3グローバル置換文字、元のファイルの修正
#!/usr/bin/python
# -*- coding: utf-8 -*-
import fileinput
for line in fileinput.input('test.txt', backup='.bak', inplace=1):
    line = line.replace('++','#')
    print line,

まず、操作するファイルを1つバックアップしてください.bakの接尾辞ファイル、inplace=1は標準出力を元のファイルに書きます.つまり、このスクリプトは標準出力がなければ、空のデータで元のファイルに書きます.
12.4.4マルチファイル操作
#!/usr/bin/python
# -*- coding: utf-8 -*-
import fileinput
for line in fileinput.input(['test.txt', 'test2.txt']):
    print line,
12.4.5           ,  tail -f
#!/usr/bin/python
# -*- coding: utf-8 -*-
with open('access.log') as f:
     f.seek(0,2)   #                  
     while True:  
         line = f.readline()
         if line:
             print line,

このデッドサイクルは、次の操作を常に実行します.性能を消耗する.
スリープを1秒間に1回読み込むことができます.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
with open('access.log') as f:
     f.seek(0,2)
     while True:
         line = f.readline()
         if line:
             print line,
         else:
             time.sleep(1)

12.5 shutil
shutilモジュールはPython内蔵モジュールで、ファイルやディレクトリのコピー、アーカイブに使用されます.
方法
説明
shutil.copyfile(src, dst)
ファイルのコピー
shutil.copytree(src, dst)
ファイルまたはディレクトリのコピー
shutil.move(src, dst)
ファイルまたはディレクトリの移動
shutil.rmtree(path,ignore_errors=False, onerror=None)
ディレクトリを再帰的に削除します.os.rmdir()はファイルのあるディレクトリを削除できません.これを使えます.
shutil.make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, dry_run=0, owner=None, group=None, logger=None)
Python2.7以降にこの方法があります.機能はzipまたはtarアーカイブファイルを作成することです.base_name:アーカイブファイル名formatを作成するには、zip、tar、bztar、gztarroot_があるアーカイブファイルフォーマットdir:圧縮するディレクトリbase_dir:?使用法:shutil.make_archive('wp','zip','/root/wordpress')   
12.6 with文
トランザクションの処理中に、読み取りに失敗したり、ファイルを閉じたりするなど、例外や後続のクリーンアップ作業が発生する可能性があります.これは例外処理文tryを使用します...Except:
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt')
try:
    data = f.read()
finally:
    f.close()

Pythonはこの場合、with文のより簡単な処理を提供します.ファイルを処理する場合は、まずファイルハンドルを取得し、ファイルからデータを読み出し、最後にファイルハンドルを閉じます.次のようになります.
#!/usr/bin/python
# -*- coding: utf-8 -*-
with open('test.txt') as f:
    data = f.read()

この方法はより簡潔に見え、いくつかの異常、清掃作業はwithに任せられた.