Python-ファイルの読み書きおよび変更

読み、三つの形式でファイルを書き込む:読み取り、書き込み、追加します。

読み取りモードと書き込みモードのR + R

図1に示すように、読み取りモードR

モードR特性を読む(1)のみ書き込みができない、読むことができます;(2)ファイルが存在しない場合に文句を言います。

(1)実施例:以下の文献に示されるように、現在のbooks.txtファイルディレクトリを読み出します。

   

解像度:

、のpython3のみオープンで、オープンでファイルを開きます。python2が開き、ファイルをすることができます。ファイルを閉じます)(近くにあります。一般的に、関連のオープンがあります

B、カレントディレクトリにある場合は、ファイル名に直接書き込み、またはパスを追加する必要がありますすることができます。

Cは、このようなことは、書き込み「R」、すなわち、書き込まれF =オープン(「books.txt」)、読み出しモードがデフォルトです。

D、すべてのコンテンツを読むには、ファイルを読み出すことができます

フォーマット、符号化及び復号化方式を追加する必要がある場合にはE、、。

F =オープン( '書籍'、R ''、エンコード= 'UTF-8')

(2)

ファイルの内容全体を読む:読み取り

readlineの:行を読んで

readlines:各行を読んで、そしてリストに入れます

  

  

2、読み書きモードR +

 R +モード機能を記述します(1)ファイルが存在しない与えられ;覆うように書かれている、(2)を読み取ることができ、書き込まれるべき最も重要なファイルの内容をカバーします

  

「水滸伝」 '普通の言葉にカバーし、元のファイルは次のようになります。

第二に、読み書きモードとwの書き込みモード+

1、書き込みモード

W書き込みモードの機能は:(1)のみ読み取ることができない、書くことができます;(2)書く時間は、ファイルの元の内容をクリアします;(3)ファイルが存在しない場合、新しいファイルを作成します。

「水滸伝」を書くときに、以下の、元の内容を空にしています。

   

f.flush():時々我々は(f.write使用)を使用すると、バッファゾーンの内容の存在に起因する一切書かれた文書を、見つけません、後に、バッファがいっぱいになった後に待機する必要があり、その後、すべてのデータが書かれています。この時、データバッファがディスクに書き込まれるの内側に強制)(f.flushことができます。

 + W 2、読み書きモード

+機能ワット読み書きをモード:(1)書き込むことができますが、読み取ることができ、(2)書く時間は、ファイルの元の内容をクリアします;(3)ファイルが存在しない場合、新しいファイルを作成します。

第三に、追加モードとリードモードは+追加します

1、モードを追加

追加モードの特徴:新規ファイルを作成し、(3)ファイルが存在しない場合、(1)読み取ることができないが、(2)、元のコンテンツの終了時に新しいコンテンツを追加書き込み付加を書き込むことができます。

  

「水滸伝」は、オリジナルコンテンツの最後に追加しました

図2に示すように、追加の読み出しモードA +

A +追加の読み出しモードの特徴:(1)読み取りと書き込み;(2)書き込みの時間が追記され、新たなコンテンツが最後に元のコンテンツに追加され、ファイルが存在しない場合(3)、新しいファイルを作成します。

さらにいくつかのパターンは以下の表に要約することができます。

読み書きモード 読み取り可能です 書き込み可能です ファイルが存在しない場合
R それはあります ノー エラー
R + それはあります はい、書きカバー エラー
ワット ノー それは、元の内容を空に 新しいファイルを作成します。
W + それはあります それは、元の内容を空に 新しいファイルを作成します。
A ノー はい、追加書き込み 新しいファイルを作成します。
+ それはあります はい、追加書き込み 新しいファイルを作成します。

第四に、ファイルポインタ

ファイルポインタはファイルがどこに行くかを記録するために使用されます。

ファイルポインタはreadlineのは何も読まないで、読み出しbooks.txt全体の内容を読んで、私たちは次の例を見ていることは非常に重要です。その理由は、読み取りを読んだ後、ファイルの末尾にファイルポインタが、その後、readlineのこの位置、確かにない内容から読み始めたということです。だから、時々、あなたはファイルポインタの位置を調整する必要があります。

   

執筆の追加モードで、または最後に書き込むには、読書のためだけ移動した後、ファイルポインタを移動することができ求めます。

また、(NUM)シーク、NUMは、文字ではなく、ラインを指します。

上記のコードでは、ファイルの先頭にポインタを移動させるために、(0)f.seekを加えます。この時間は、あなたが最初から読むことができるのreadline。

  

第五に、自動的にファイルをクローズ

 自動的にファイルを閉じると、次のようにします。

:Fとして( 'books.txt'、 '+')オープンと
    f.write( '\ nは三体')

第六に、ファイルの変更

1、簡単、粗直接変更

最もシンプルで、粗ファイルを変更、手順は次のとおりです。

(1)ファイルの内容にアクセスし、ファイルを開きます。

(2)コンテンツを変更します。

(3)原稿の内容を空にし、

(4)それに新しいコンテンツを書き込みます。

この方法は非常に簡単で、以下の例を見て----小さなファイル保存されたユーザ名を名とパスワードで、示さ形式として。私たちは、すべての名前の前に「_クラス」を追加したいです

中国を含む「クラス_」ので、エンコード=「UTF-8」、それ以外の場合は文字化けしますに呼び出す必要があります。

   

バックアップファイルの2方法

当文件很大时,刚刚的方法在一次性读取文件内容和写入新内容时,耗时长,占用磁盘空间也较大。

备份文件的方法可以建立一个备份文件,修改一行写一行,具体步骤如下:

(1)打开2个文件,原文件a和备份文件b。如a.txt    b.txt.bak

(2)删除a文件,将b文件名改为a文件名

例:将文件words里的“花”改成“flower”

七、小练习

 1、产生手机号 前几位一样1861253 后四位随机,写到文件里。

分析:(1)首先要随机产生一些四位数,位数不足的要补0,zfill可以给字符串补0;

(2)需要写到文件里,可以用w或者a模式。文件有打开就要有关闭。

import random
f = open('phones.txt','w')
num = int(input('请输入你要产生的手机号个数:'))
for i in range(num):
    start = '1861253'
    random_num = str(random.randint(1,9999))
    new_num = random_num .zfill(4) #不够4位就补0,仅对字符串可以使用
    phone_num = start + new_num
    f.write(phone_num+'\n')
f.close()

2、监控服务器日志,如果ip出现的次数大于50次,就把该ip加入黑名单。日志文件的格式如下图

分析:(1)首先,我们应该从日志里提取出所有ip。根据日志文件的格式,我们可以看到每一行的开头是ip,那么可以一行一行的读取数据,然后用空格进行分割,则该行第一个元素就是ip。(2)然后需要统计每一个ip出现的次数,最直接想到的就是count。(3)找到出现次数大于50次的ip,打印出来。

import time

point = 0#记录文件指针的位置
while True:
    f = open(r'D:\access.log',encoding='utf-8')
    all_ips = []
    f.seek(point)#移动文件指针,本次接着上次的位置继续读
    for line in f:
        ip = line.split()[0]#每行第一个元素为IP
        all_ips.append(ip)#存放所有的ip,不去重
    point = f.tell()# 获取文件当前指针位置
    ips_set = set(all_ips)#去重
    for i in ips_set:
        if all_ips.count(i)>50:
            print('应该加入黑名单的ip是:%s\n'%i)
    time.sleep(60)#暂停60s

运行结果为:

 

 

文件的读写有三种形式:读、写和追加。

一、读模式 r 和读写模式 r+

1、读模式 r

读模式r特点:(1)只能读,不能写;(2)文件不存在时会报错。

(1)例:读取当前目录下的books.txt文件,该文件如下所示。

   

解析:

a、用open打开文件,在python3中只有open。python2可以用open和file。关闭文件是close()。一般有开就有关

b、如果在当前目录,可以直接写文件名,否则需添加路径。

c、如果不写 'r',即写成  f = open('books.txt'),也是默认读模式。

d、read可以将文件所有的内容都读出来

e、另外,有时需要添加解码格式 encoding ,格式为:

f = open('books','r',encoding='utf-8')

(2)

read:读取文件全部内容

readline:读取一行

readlines:读取每一行,并且放到一个list里

  

  

2、读写模式 r+

 读写模式r+特点:(1)文件不存在时会报错;(2)可以读,也可以写,是覆盖写,会把文件最前面的内容覆盖

  

‘水浒传’把‘平凡的’三个字覆盖,原来的文件变为:

二、写模式 w 和写读模式 w+

1、写模式

写模式w特点:(1)只能写,不能读;(2)写的时候会把原来文件的内容清空;(3)当文件不存在时,会创建新文件。

如下,写入‘水浒传’时,将原来的内容都清空。

   

f.flush():有时我们用f.write()后,会发现没有写入文件,这是因为内容存在了缓冲区,需要等缓冲区满了之后,再把所有数据写入。此时可以用f.flush()强制把缓冲区里面的数据写到磁盘上。

 2、写读模式 w+

写读模式w+特点:(1)可以写,也可以读;(2)写的时候会把原来文件的内容清空;(3)当文件不存在时,会创建新文件。

三、追加模式a和追加读模式a+

1、追加模式a

追加模式a特点:(1)不能读;(2)可以写,是追加写,即在原内容末尾添加新内容;(3)当文件不存在时,创建新文件。

  

将‘水浒传’添加到原内容的末尾

2、追加读a+模式

追加读a+模式特点:(1)可读可写;(2)写的时候是追加写,即在原内容末尾添加新内容;(3)当文件不存在时,创建新文件。

以上几种模式,可以用下表来总结:

读写模式 是否可读 是否可写 文件不存在时
r 报错
r+ 是,覆盖写 报错
w 是,清空原内容 创建新文件
w+ 是,清空原内容 创建新文件
a 是,追加写 创建新文件
a+ 是,追加写 创建新文件

四、文件指针

文件指针用来记录文件走到哪里。

文件指针是很重要的,我们看下面的例子中,read将books.txt的内容全部读了出来,readline则没有读出任何内容。原因是read读完之后,文件指针到了文件的末尾,此时readline接着从这个位置开始读,肯定是没内容的。因此有时需要调整文件指针的位置。

   

seek可以移动文件指针,移动后只是针对读,用追加模式写的时候,还是在末尾写。

另外,seek(num),这个num指的是字符,不是行。

在上面的代码中,加一句f.seek(0),即可将指针移到文件开头。这次,readline就可以从头开始读了。

  

五、自动关闭文件

 with可以自动关闭文件,用法如下:

with open('books.txt','a+') as f:
    f.write('\n三体')

六、文件修改

1、简单粗暴直接修改

最简单粗暴的修改文件,步骤是:

(1)打开文件,获取文件内容;

(2)对内容进行修改;

(3)清空原来文件的内容;

(4)把新的内容写进去。

这种方法很简单,下面看一个小例子----文件username里存放了姓名和密码,如下图格式。我们要在所有姓名前加上‘A班_’

因为'A班_'中含有中文,需要叫上encoding='utf-8',否则会出现乱码。

   

2、备份文件的方法

当文件很大时,刚刚的方法在一次性读取文件内容和写入新内容时,耗时长,占用磁盘空间也较大。

备份文件的方法可以建立一个备份文件,修改一行写一行,具体步骤如下:

(1)打开2个文件,原文件a和备份文件b。如a.txt    b.txt.bak

(2)删除a文件,将b文件名改为a文件名

例:将文件words里的“花”改成“flower”

七、小练习

 1、产生手机号 前几位一样1861253 后四位随机,写到文件里。

分析:(1)首先要随机产生一些四位数,位数不足的要补0,zfill可以给字符串补0;

(2)需要写到文件里,可以用w或者a模式。文件有打开就要有关闭。

import random
f = open('phones.txt','w')
num = int(input('请输入你要产生的手机号个数:'))
for i in range(num):
    start = '1861253'
    random_num = str(random.randint(1,9999))
    new_num = random_num .zfill(4) #不够4位就补0,仅对字符串可以使用
    phone_num = start + new_num
    f.write(phone_num+'\n')
f.close()

2、监控服务器日志,如果ip出现的次数大于50次,就把该ip加入黑名单。日志文件的格式如下图

分析:(1)首先,我们应该从日志里提取出所有ip。根据日志文件的格式,我们可以看到每一行的开头是ip,那么可以一行一行的读取数据,然后用空格进行分割,则该行第一个元素就是ip。(2)然后需要统计每一个ip出现的次数,最直接想到的就是count。(3)找到出现次数大于50次的ip,打印出来。

import time

point = 0#记录文件指针的位置
while True:
    f = open(r'D:\access.log',encoding='utf-8')
    all_ips = []
    f.seek(point)#移动文件指针,本次接着上次的位置继续读
    for line in f:
        ip = line.split()[0]#每行第一个元素为IP
        all_ips.append(ip)#存放所有的ip,不去重
    point = f.tell()# 获取文件当前指针位置
    ips_set = set(all_ips)#去重
    for i in ips_set:
        if all_ips.count(i)>50:
            print('应该加入黑名单的ip是:%s\n'%i)
    time.sleep(60)#暂停60s

运行结果为:

 

おすすめ

転載: www.cnblogs.com/guohu/p/11308023.html