Pythonの小さなエクササイズファイル操作

概要:実行中のショートカットキーをカスタマイズする

以前はマウスでクリックするのが面倒だと思っていたので、今日は設定しました。参考までにこちらをクリックしてください。

演習1:ファイル操作とコーディングの問題の最初の経験

write(a):文字列aをファイルに書き込みます
writelines(b):文字列リストを改行文字を追加せずにファイルに書き込みます

f = open(r"a.txt","w",encoding="utf-8")	#指定utf-8编码
f.write("今天是2020-11-16")
f.close()

ここに画像の説明を挿入
エンコードとデコードが一致し、情報を正常に表示できます

f = open(r"Blank.txt","a",encoding="utf-8")

s = ["Clichong\n","Lawrence\n","Kacura\n"]
ss = "啦啦啦,啦啦啦,我是卖报的小当家"
f.writelines(s)
f.write(ss)
f.close()

ここに画像の説明を挿入
コンテキストマネージャーと一緒に使用して管理する

s = ["Clichong ","Lawrence ","Kacura "]

with open(r"Blank.txt","w",encoding="utf-8") as myio:
    myio.writelines(s)		#不会自动的换行

ここに画像の説明を挿入
ps:コンソールの文字化けの問題を解決するには、エンコーディングを統一フォーマットに設定します。
ここに画像の説明を挿入

演習2:ファイルの読み取り
  1. read([size])
    は、ファイルからサイズ文字を読み取り、結果として返します。サイズパラメータがない場合は、ファイル全体が読み取られます。
    ファイルの最後まで読み取ると、空の文字列が返されます。
  2. readline()
    はコンテンツの行を読み取り、結果としてそれを返します。ファイルの最後まで読み取ると、空の文字列が返されます。
  3. readlines()
    テキストファイルでは、各行が文字列としてリストに格納され、リストが返されます
s = ["Clichong ","Lawrence ","Kacura "]

with open(r"Birthday.txt","r",encoding="utf-8") as myio:
    print(myio.read(4),end="\n\n")
    myio.seek(0)
    print(myio.readline(),end="\n\n")
    myio.seek(0)
    print(myio.readlines(),end="\n\n")
    myio.seek(0)
    print(myio.read())

ここに画像の説明を挿入

演習3:テキストファイルの各行の最後に行番号を追加します
with open(r"Blank.txt","r",encoding="utf-8") as myio:
    line = myio.readlines()
    print(list(enumerate(line)))	#其中enumerate函数可以为每一行在开头添加一个行号
    myline = [str(information).rstrip()+" #"+str(number+1)+"\n" for number,information in enumerate(line)]
    print(myline)

with open(r"Blank.txt","w",encoding="utf-8") as myio:
    myio.writelines(myline)

ここに画像の説明を挿入
行番号が追加されました
ここに画像の説明を挿入

演習4:ファイルをコピーする

初期バージョン:

with open(r"Birthday.txt","r",encoding="utf-8") as myfile:
    with open(r"CopyBirthday.txt","w",encoding="utf-8") as mycopyfile:
        while True:
            if myfile.readline():		#由于判断的时候已经读取了文件会造成文件指针的偏移,会丢包
                mycopyfile.write(myfile.readline())
            else:
                break

改善されたバージョン:

with open(r"test.txt","r",encoding="utf-8") as myfile:
    with open(r"copytest.txt","w",encoding="utf-8") as mycopyfile:
        while True:
            line = myfile.readline()		#指读取一次,不会丢包
            if line:
                mycopyfile.write(line)
            else:
                break

ご覧のとおり、2つのファイルの内容はまったく同じです
ここに画像の説明を挿入
ここに画像の説明を挿入

演習5:シリアル化と逆シリアル化

「メモリブロックデータ」をハードディスクに保存するか、ネットワーク経由で他のコンピュータに転送する必要があります。このとき、「オブジェクトのシリアル化と逆シリアル化」が必要です。オブジェクトのシリアル化メカニズムは、分散システムおよび並列システムで広く使用されています

pickle.dump(obj、file)objはシリアル化されるオブジェクトであり、fileは保存されたファイルを参照します
pickle.load(file)はファイルからデータを読み取り、それをオブジェクトに逆シリアル化します

import pickle

a1 = "Clichong"
a2 = "Lawrence"
a3 = "Kacura"

with open(r"Blank.txt","wb+") as myfile:    #只能是二进制的,而且不能指定编码形式
    pickle.dump(a1,myfile)
    pickle.dump(a2,myfile)
    pickle.dump(a3,myfile)

    myfile.seek(0)
    print(myfile.read())

with open(r"Blank.txt","rb") as myfile:
    b1 = pickle.load(myfile)
    b2 = pickle.load(myfile)
    b3 = pickle.load(myfile)

    print(b1,b2,b3)

ここに画像の説明を挿入
ここに画像の説明を挿入

演習6:CSVファイルの操作

csv(コンマ区切り値)はコンマ区切りのテキスト形式であり、データ交換、Excelファイルおよびデータベースデータのインポートとエクスポートに一般的に使用されます。

import csv

info = ['id','name','age','salary']
infos = [['1005','Petty','41','32000'],['1006','Kitty','22','10000']]

with open(r"csvfile.csv","w",encoding="utf-8") as myfile:
    writebuf = csv.writer(myfile)
    writebuf.writerow(info)		#写入一行(标题)
    writebuf.writerows(infos)	#写入多行(数据)
 
with open(r"csvfile.csv","r",encoding="utf-8") as myfile:
    readbuf = csv.reader(myfile)	#创建 csv 对象,它是一个包含所有数据的列表,每一行为一个元素
   # headers = next(readbuf)		#获得列表对象,包含标题行的信息
    print(list(readbuf))
    myfile.seek(0)
    linetxt = [id+"-"+name+"-"+age+"-"+salary+"\n" for id,name,age,salary in readbuf]

    with open(r"Blank.txt", "w", encoding="utf-8") as mywritefile:
        mywritefile.writelines(linetxt)

データの読み取りと再書き込みに成功しました。
ここに画像の説明を挿入
ここに画像の説明を挿入

演習7:ディレクトリ操作
import os
import os.path

print("#当前工作路径是",os.getcwd())
#os.mkdir("testdir")    #只能创建一次,若已创建则报错
#os.makedirs("音乐/刘德华")   #一次可以创建多个目录
print("#是否是绝对路径",os.path.isabs("myfile06.py"))
print("#是否是目录文件",os.path.isdir("myfile06.py"))
print("#是否是文件",os.path.isfile("myfile06.py"))
print("#文件是否存在",os.path.exists("myfile06.py"))
print("#文件的大小是",os.path.getsize("myfile06.py"))
print("#返回文件的最后访问时间",os.path.getatime("myfile06.py"))  #返回文件的最后访问时间
print("#返回文件的最后创建时间",os.path.getctime("myfile06.py"))  #返回文件的最后修改时间
print("#返回文件的最后修改时间",os.path.getmtime("myfile06.py"))
print("#直接返回路径",os.path.abspath("myfile06.py"))   #直接返回路径
print("#返回目录路劲",os.path.dirname("E:\PyCharm\workspace\myIO\myfile06.py"))   #返回目录路劲
print("#对路径进行切割",os.path.split(os.path.abspath("myfile06.py")))
print("#对路径切割出文件的拓展名",os.path.splitext(os.path.abspath("myfile06.py")))
s = "D:\\"
print("#对多个目录名进行连接形成绝对路径",os.path.join(s,"音乐","刘德华","忘情水.mp4"))

ここに画像の説明を挿入

演習8:指定したディレクトリ内のすべての.pyファイルを一覧表示し、ファイル名を出力します
方法1:カスタム機能
import os
import os.path

os.chdir("E:\PyCharm\workspace")		#更改当前的工作目录
print(os.getcwd())

def FileList(dirname):					#传入一个目录名,就可以打印出目录下的全部.py文件
    if not os.path.isdir(dirname):		#判断是否为目录文件
        print("Error! Not Dir!")
        return
    else:
        mylist = os.listdir(os.path.abspath(dirname))	#将所有的文件输出一个列表中方便处理
        print(mylist)

        for file in mylist:
            filename,filetext = os.path.splitext(file)	#python的特殊语法,真是太简单了
            if filetext == ".py":
                print(file)

FileList("myIO")

ここに画像の説明を挿入
ご覧のとおり、すべての.pyファイルは正常に出力されます
ここに画像の説明を挿入

方法2:endswithを使用する

このメソッドは、文字列のendswith関数を使用して、最後の文字を判別します
ここに画像の説明を挿入

for file in os.listdir():
    if file.endswith("py"):	#灵活的使用了字符串的函数
        print(file)

ここに画像の説明を挿入

方法3:推論(1行のコード)

控除を柔軟に使用すると、コードを簡潔にすることができます

mypyfile = [pyfile for pyfile in os.listdir() if pyfile.endswith("py")]

図のように正常に出力できます
ここに画像の説明を挿入

演習9:歩行トラバーサル機能の使用をテストする

os.walk()メソッド:3つの要素(dirpath、dirnames、filenames)のタプルを返します。

  • dirpath:指定したディレクトリのパスを一覧表示します
  • dirnames:ディレクトリの下のすべてのフォルダ
  • ファイル名:ディレクトリ内のすべてのファイル
#测试walk函数

import os
import os.path

#os.chdir("E:\PyCharm\workspace")
print(os.getcwd())

Allfile = os.walk(os.getcwd())

for dirpath,dirnames,filenames in Allfile:
    for dir in dirnames:
        print(os.path.join(dirpath,dir))
    for file in filenames:
        print(os.path.join(dirpath,file))
  #  print(dirpath)
  #  print(dirnames)
  #  print(filenames)

ここに画像の説明を挿入

演習10:shutilモジュールのコピーと圧縮をテストする
コピーテスト
#测试shutil模块


import shutil
import os

print(os.getcwd())
os.chdir("E:\PyCharm\workspace\myIO\音乐\刘德华")
shutil.copy("note.txt","copynote.txt")

os.chdir("E:\PyCharm\workspace\myIO")
#不要忽视.这个符号,要写得完整为.txt,.html
shutil.copytree("音乐\刘德华","电影",ignore=shutil.ignore_patterns(".txt",".html"))


ここに画像の説明を挿入
実行:実行後:
ここに画像の説明を挿入

圧縮試験
  • 最初の圧縮方法
#把目录下:音乐/刘德华下的全部内容压缩到目录:电影/歌手 中去,格式为zip格式
 shutil.make_archive("电影/歌手","zip","音乐/刘德华")	

ここに画像の説明を挿入

  • 2番目の圧縮方法
import shutil
import zipfile

#shutil.make_archive("电影/歌手","zip","音乐/刘德华")

myfile = zipfile.ZipFile("音乐/Clichong.zip","w")	#压缩包存放位置
myfile.write("电影/copynote.txt")		#往压缩文件夹中添加的数据
myfile.write("电影/note.txt")
myfile.close()

ここに画像の説明を挿入

解凍テスト
import shutil
import zipfile

#shutil.make_archive("电影/歌手","zip","音乐/刘德华")

'''''''''
myfile = zipfile.ZipFile("音乐/Clichong.zip","w")
myfile.write("电影/copynote.txt")
myfile.write("电影/note.txt")
myfile.close()
'''''''''

myfile2 = zipfile.ZipFile("音乐/Clichong.zip","r")	#要解压缩的文件为Clichong.zip
myfile2.extractall("音乐")		#解压缩的目录
myfile2.close()


ここに画像の説明を挿入

演習11:再帰的な方法を使用して、ディレクトリ全体をトラバースし、ツリーとして出力します
#递归遍历目录

import os

def DirNameSearch(dirpassname,level):

    allname = os.listdir(dirpassname)
    for dirname in allname:
        wholefilename = os.path.join(dirpassname, dirname)
        if os.path.isdir(wholefilename):
            DirNameSearch(wholefilename,level+1)
        else:
            print("|_"+"___"*level,wholefilename)

DirNameSearch("音乐",0)

ディレクトリ構造は次のとおりです。
ここに画像の説明を挿入
トラバースの結果:
ここに画像の説明を挿入
ディレクトリ全体でテストしてみましょう。

DirNameSearch("E:\PyCharm\workspace\myIO",0)

ここに画像の説明を挿入

ここに画像の説明を挿入
それはまだよりよく横断することができます

おすすめ

転載: blog.csdn.net/weixin_44751294/article/details/109732684