找回密码
 会员注册
查看: 29|回复: 0

Python超详细基础文件操作(详解版)

[复制链接]

2

主题

0

回帖

7

积分

新手上路

积分
7
发表于 2024-9-9 22:29:34 | 显示全部楼层 |阅读模式
一、文件操作1.文件打开与关闭1.1打开文件在Python中,你可以使用open()函数来打开文件。以下是一个简单的例子:#打开文件(默认为只读模式)file_path='example.txt'withopen(file_path,'r')asfile:#执行文件操作,例如读取文件内容file_content=file.read()print(file_content)#文件在with块结束后会自动关闭,无需显式关闭文件12345678'运行运行在上述示例中:'example.txt'是文件的路径和名称,你可以根据实际情况修改为你想要打开的文件。'r'表示只读模式。如果你想要写入文件,可以使用'w'模式,如果想要追加内容,可以使用'a'模式等。withopen(...)asfile:是使用上下文管理器的方式,确保文件在使用后被正确关闭,即使在处理文件时发生异常也能保证关闭。1.2关闭文件在Python中关闭文件有两种主要的方法:1.2.1使用with语句with语句是一种上下文管理器,当它的代码块执行完毕时,会自动关闭文件。这是推荐的方式,因为它确保文件在使用完毕后被正确关闭,即使发生异常也能保证关闭。file_path='example.txt'withopen(file_path,'r')asfile:#执行文件操作,例如读取文件内容file_content=file.read()print(file_content)#文件在这里已经被自动关闭123456'运行运行1.2.2使用close()方法:你可以显式调用文件对象的close()方法来关闭文件。这种方法适用于一些特殊情况,但相对来说不如with语句简洁和安全。file_path='example.txt'file=open(file_path,'r')try:#执行文件操作,例如读取文件内容file_content=file.read()print(file_content)finally:file.close()12345678'运行运行在使用with语句时,不需要显式调用close()方法。如果你在代码中打开了文件而没有使用with,请确保在适当的地方调用close()以关闭文件,以避免资源泄漏。2.访问模式及说明访问模式说明r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。r+打开一个文件用于读写。文件指针将会放在文件的开头。w+打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。a+打开一个文件用于读写,如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果改文件不存在,创建新文件用于读写。rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头wb+以二进制格式打开一个文件用于读写。如果改文件已存在则会覆盖。如果改文件不存在,创建新文件。ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果改文件不存在,创建新文件用于读写。二、文件读写1.写数据(write)写入数据通常涉及将信息保存到文件、数据库或其他持久性存储介质中。以下是一些常见的数据写入场景的示例:1.1写入文本文件使用内置的open函数来打开文件并写入内容。确保使用适当的模式(例如,'w'表示写入)。file_path='example.txt'#写入文件withopen(file_path,'w')asfile:file.write("Hello,thisissomedata.")12345'运行运行1.2写入CSV文件使用csv模块来写入CSV格式的文件。importcsvcsv_file_path='example.csv'data=[['Name','Age','Occupation'],['JohnDoe',30,'Engineer'],['JaneSmith',25,'Designer']]withopen(csv_file_path,'w',newline='')ascsvfile:csv_writer=csv.writer(csvfile)csv_writer.writerows(data)1234567891011'运行运行1.3写入JSON文件使用内置的json模块来写入JSON格式的文件。importjsonjson_file_path='example.json'data={"name":"JohnDoe","age":30,"occupation":"Engineer"}withopen(json_file_path,'w')asjsonfile:json.dump(data,jsonfile)12345678'运行运行1.4写入数据库使用数据库连接库(如sqlite3、mysql-connector-python等)与相应的数据库进行交互。importsqlite3#连接到SQLite数据库(假设有一个名为example.db的数据库)conn=sqlite3.connect('example.db')#创建一个游标对象cursor=conn.cursor()#执行SQL插入语句cursor.execute("INSERTINTOusers(name,age,occupation)VALUES(?,?,?)",('JohnDoe',30,'Engineer'))#提交更改conn.commit()#关闭连接conn.close()123456789101112131415162.读数据(read)读取数据通常涉及从文件、数据库或其他存储介质中检索信息。以下是一些读取数据的常见示例:2.1读取文本文件使用内置的open函数来打开文件并读取内容。file_path='example.txt'#读取文件withopen(file_path,'r')asfile:data=file.read()print(data)123456'运行运行2.2读取CSV文件使用csv模块来读取CSV格式的文件。importcsvcsv_file_path='example.csv'#读取CSV文件withopen(csv_file_path,'r')ascsvfile:csv_reader=csv.reader(csvfile)forrowincsv_reader:print(row)1234567892.3读取JSON文件使用内置的json模块来读取JSON格式的文件。importjsonjson_file_path='example.json'#读取JSON文件withopen(json_file_path,'r')asjsonfile:data=json.load(jsonfile)print(data)123456782.4从数据库中读取数据使用数据库连接库(如sqlite3、mysql-connector-python等)与相应的数据库进行交互。importsqlite3#连接到SQLite数据库(假设有一个名为example.db的数据库)conn=sqlite3.connect('example.db')#创建一个游标对象cursor=conn.cursor()#执行SQL查询语句cursor.execute("SELECT*FROMusers")#检索所有行rows=cursor.fetchall()#打印每一行forrowinrows:print(row)#关闭连接conn.close()12345678910111213141516171819202.读数据(readlines)readlines是Python中用于读取文件的方法之一,它用于逐行读取文件内容,并将每一行作为字符串存储在一个列表中。下面是对readlines方法的详细解释:使用readlines方法的基本语法withopen('file.txt','r')asfile:lines=file.readlines()12解释:open('file.txt','r'):打开文件'file.txt'以供读取。第一个参数是文件名,第二个参数是打开文件的模式。'r'表示只读模式。with...as...:使用with语句可以确保在读取完成后自动关闭文件,不需要显式调用file.close()。lines=file.readlines():readlines方法用于读取文件的所有行,并将每一行作为一个字符串存储在列表lines中。每个列表元素对应文件中的一行文本。你可以使用列表索引来访问特定行,例如lines[0]表示文件的第一行。例子:假设‘file.txt’包含以下内容:Hello,thisisline1.Thisisline2.Andthisisline3.123使用readlines后:withopen('file.txt','r')asfile:lines=file.readlines()#lines现在是一个包含每一行文本的列表print(lines)#输出:#['Hello,thisisline1.\n','Thisisline2.\n','Andthisisline3.\n']#访问特定行print(lines[0].strip())#输出:Hello,thisisline1.12345678910注意事项:每一行的末尾都包含换行符\n,你可以使用strip()方法去除这些额外的空白字符。readlines方法适用于处理包含多行文本的文件,但对于大型文件,可能需要考虑逐行读取而不是将整个文件加载到内存中。这可以通过循环遍历文件对象来实现,而不是使用readlines。3.读数据(readline)readline是Python中用于读取文件的方法之一,它用于逐行读取文件内容,并返回文件中的一行作为字符串。以下是对readline方法的详细解释:使用readline方法的基本语法withopen('file.txt','r')asfile:line=file.readline()12解释:open('file.txt','r'):打开文件'file.txt'以供读取。第一个参数是文件名,第二个参数是打开文件的模式。'r'表示只读模式。with...as...:使用with语句可以确保在读取完成后自动关闭文件,不需要显式调用file.close()。line=file.readline():readline方法用于读取文件的一行,并将该行作为一个字符串存储在变量line中。例子:假设‘file.txt’包含以下内容:Hello,thisisline1.Thisisline2.Andthisisline3.123使用readline后:withopen('file.txt','r')asfile:line1=file.readline()line2=file.readline()line3=file.readline()print(line1)#输出:Hello,thisisline1.print(line2)#输出:Thisisline2.print(line3)#输出:Andthisisline3.12345678注意事项:每个readline调用都会读取文件的下一行。返回的字符串包含行末尾的换行符\n。如果不需要换行符,可以使用strip()方法去除它。当文件读取完毕后,readline将返回空字符串‘’,因此可以在循环中使用whileline!=''来逐行读取整个文件。循环读取整个文件:withopen('file.txt','r')asfile:line=file.readline()whileline!='':print(line.strip())#去除换行符line=file.readline()12345这个循环将逐行读取整个文件,直到文件末尾。4.readlines和readline的区别readlines和readline是Python中用于读取文件的两种不同方法,它们之间有一些重要的区别:4.1readlines方法:返回类型:readlines方法返回一个包含文件所有行的列表,其中每个元素都是文件中的一行文本字符串。使用情况:适用于处理包含多行文本的文件,可以一次性将整个文件加载到内存中。这种方法适用于文件较小,可以完全装入内存的情况。例子:withopen('file.txt','r')asfile:lines=file.readlines()`124.2readline方法:返回类型:readline方法每次调用只返回文件中的一行作为字符串。如果再次调用,将返回下一行。当文件读取完毕后,返回空字符串‘’。使用情况:适用于逐行处理大型文件,可以有效地降低内存使用。因为它一次只读取一行,可以在循环中逐行处理文件,而不必将整个文件加载到内存中。例子:withopen('file.txt','r')asfile:line=file.readline()whileline!='':print(line.strip())#去除换行符line=file.readline()123454.3区别总结:readlines一次性读取整个文件的所有行,并返回一个包含所有行的列表。readline逐行读取文件,每次调用返回文件中的一行,适用于处理大型文件,减少内存占用。readlines返回包含换行符的每一行,而readline返回单独的行,需要手动去除换行符。选择使用哪个方法取决于文件的大小和处理需求。如果文件较小,可以完全装入内存,使用readlines;如果文件较大,可以逐行处理,使用readline。三、文件的相关操作1.文件重命名Python文件重命名是文件管理中的一个基本操作,可以通过Python的内置库来实现。以下是一个超详细的入门指南,介绍如何使用Python重命名文件:1.2导入必要的库首先,您需要导入Python的os库,它提供了许多与操作系统交互的函数。importos1'运行运行1.2准备文件列表要重命名文件,您需要先列出指定目录中的所有文件。可以使用os.listdir()函数来获取目录中的文件列表。#列出指定目录中的所有文件和文件夹files=os.listdir('path_to_directory')121.3遍历文件列表接着,您需要遍历文件列表,对每一个文件进行重命名。forfileinfiles:#获取文件的完整路径full_path=os.path.join('path_to_directory',file)#检查是否是文件ifos.path.isfile(full_path):#新的文件名new_filename='new_name'#重命名操作os.rename(full_path,os.path.join('path_to_directory',new_filename))print(f'Renamed{file}to{new_filename}')1234567891011121.4异常处理在重命名文件时,可能会出现各种异常,例如目标文件已存在、没有足够权限等。为了确保程序的健壮性,应该添加异常处理。try:forfileinfiles:#...(上面的代码)exceptOSErrorase:print(f'Erroroccurred:{e}')123451.5完整的脚本示例importos#指定要重命名文件的目录directory='path_to_directory'#列出目录中的所有文件files=os.listdir(directory)#遍历文件列表并进行重命名forfileinfiles:ifos.path.isfile(os.path.join(directory,file)):#设定新的文件名new_filename='new_name'#重命名文件trys.rename(os.path.join(directory,file),os.path.join(directory,new_filename))print(f'Renamed{file}to{new_filename}')exceptOSErrorase:print(f'Errorrenaming{file}:{e}')12345678910111213141516171819201.6注意安全性和效率在批量重命名文件时,应确保:不要同时进行多个重命名操作,以避免潜在的竞争条件。确保目标目录存在,避免在重命名时创建不存在的目录。考虑到操作系统对文件重命名的限制,例如在Windows中,文件名不能超过255个字符,而在Unix/Linux中则没有这个限制。1.7高级用法对于更复杂的重命名任务,您可以使用正则表达式或者其他文本处理方法来生成新的文件名。importosimportre#指定目录directory='path_to_directory'#列出目录中的所有文件files=os.listdir(directory)#遍历文件列表并进行重命名forfileinfiles:ifos.path.isfile(os.path.join(directory,file)):#使用正则表达式匹配文件名模式,并替换为新的模式new_filename=re.sub(r'\d+','new_prefix',file)#重命名文件trys.rename(os.path.join(directory,file),os.path.join(directory,new_filename))print(f'Renamed{file}to{new_filename}')exceptOSErrorase:print(f'Errorrenaming{file}:{e}')123456789101112131415161718192021这个脚本会将指定目录中所有以数字开头的文件重命名为新的前缀。2.删除文件在Python中,删除文件是一个相对简单的操作。我们可以使用os库中的os.remove()函数来实现。以下是一个超详细的入门指南,介绍如何使用Python删除文件:2.1导入必要的库首先,您需要导入Python的os库,它提供了许多与操作系统交互的函数。importos1'运行运行2.2准备文件路径要删除文件,您需要知道要删除的文件的路径。file_path='path_to_file'1'运行运行2.3检查文件是否存在在删除文件之前,最好检查该文件是否存在,以避免错误。ifos.path.isfile(file_path):print(f'File{file_path}exists,proceedtodelete.')else:print(f'File{file_path}doesnotexist,skipdeletion.')1234**2.4执行删除操作如果文件存在,您可以使用os.remove()函数来删除它。trys.remove(file_path)print(f'File{file_path}deletedsuccessfully.')exceptOSErrorase:print(f'Erroroccurred:{e}')123452.5完整的脚本示例importos#指定要删除的文件的目录file_path='path_to_file'#检查文件是否存在ifos.path.isfile(file_path):print(f'File{file_path}exists,proceedtodelete.')else:print(f'File{file_path}doesnotexist,skipdeletion.')#执行删除操作trys.remove(file_path)print(f'File{file_path}deletedsuccessfully.')exceptOSErrorase:print(f'Erroroccurred:{e}')1234567891011121314'运行运行2.6注意安全性和效率在批量删除文件时,应确保:不要同时进行多个删除操作,以避免潜在的竞争条件。确保目标目录存在,避免在删除时创建不存在的目录。考虑到操作系统对文件删除的操作限制,例如在Windows中,文件名不能超过255个字符,而在Unix/Linux中则没有这个限制。通过以上步骤,您应该能够掌握如何使用Python删除文件。3.创建文件在Python中,创建文件是一个相对简单的操作。我们可以使用os库中的os.open()函数或者with语句来创建文件。以下是一个超详细的入门指南,介绍如何使用Python创建文件:3.1导入必要的库首先,您需要导入Python的os库,它提供了许多与操作系统交互的函数。importos1'运行运行3.2准备文件路径要创建文件,您需要知道要创建的文件的路径。file_path='path_to_file'1'运行运行3.3检查文件路径是否存在在创建文件之前,最好检查该文件路径是否存在,以避免覆盖其他文件。ifnotos.path.exists(file_path):print(f'Filepath{file_path}doesnotexist,proceedtocreate.')else:print(f'Filepath{file_path}alreadyexists,skipcreation.')12343.4执行创建操作如果文件路径不存在,您可以使用os.open()函数来创建文件。try:withopen(file_path,'w')asf:print(f'File{file_path}createdsuccessfully.')exceptIOErrorase:print(f'Erroroccurred:{e}')12345这里,我们使用with语句来确保文件在操作完成后会被正确关闭。'w'参数表示以写入模式打开文件,如果文件不存在,会创建一个新文件。3.5完整的脚本示例importos#指定要创建的文件的目录file_path='path_to_file'#检查文件路径是否存在ifnotos.path.exists(file_path):print(f'Filepath{file_path}doesnotexist,proceedtocreate.')else:print(f'Filepath{file_path}alreadyexists,skipcreation.')#执行创建操作try:withopen(file_path,'w')asf:print(f'File{file_path}createdsuccessfully.')exceptIOErrorase:print(f'Erroroccurred:{e}')1234567891011121314'运行运行3.6注意安全性和效率在创建文件时,应确保:拥有创建文件的足够权限。避免在内存不足的情况下创建大型文件。通过以上步骤,您应该能够掌握如何使用Python创建文件。4.获取当前目录在Python中,我们可以使用os库中的os.getcwd()函数来获取当前目录的路径。以下是一个示例:importoscurrent_directory=os.getcwd()print(f'Currentdirectoryis:{current_directory}')123'运行运行这将会打印出当前Python脚本所在目录的路径。四、示例1.目录.txt自动清洗1.1需要在二级所在行最前面空4个格子,一级不用1.2需要在章和节字的后面加上一个空格1.3需要在页码前面加上=>符号#获取桌面路径importosimportredesktop_path=os.path.join(os.path.expanduser("~"),"Desktop")#目标文件路径file_path=os.path.join(desktop_path,"目录.txt")#打开文件并读取内容withopen(file_path,'r',encoding='utf-8')asfile:lines=file.readlines()modified_lines=[]forlineinlines:#去除空格line=line.replace("","")iflen(line)==1:continue#使用正则表达式在'章'或'节'后面添加一个空格,仅在后面没有空格的情况下line=re.sub(r'(章|节)(?![])',r'\1',line)#在小数点后添加空格line=re.sub(r'(\.\d)',r'\1',line)if'章'notinline:#二级添加4个空格line=''*4+line#匹配并去除最外层的英文括号pattern_en=r'\(([\d\s]+)\)'line=re.sub(pattern_en,r'\1',line)#匹配并去除最外层的中文括号及其内部内容(包括除数字和空格以外的字符)pattern=r'(([^)]+))'line=re.sub(pattern,r'\1',line)#确保每行只有一个=>if'=>'notinline:#在页码数字前添加=>(只在行尾)line=re.sub(r'(\d+),r'=>\1',line)#去除中文汉字和'=>整体符号左边的冗余符号pattern=r'([\u4e00-\u9fff]+)[^\w\s]+=>'line=re.sub(pattern,r'\1=>',line)modified_lines.append(line)#将修改后的内容写回文件withopen(file_path,'w',encoding='utf-8')asfile:file.writelines(modified_lines)#读取文件内容withopen(file_path,'r',encoding='utf-8')asfile:content=file.read()print(content)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748492.批量修改文件夹下的文件命名你可以使用Python的os模块来实现对文件名的批量修改,结合字符串操作来确保文件名中的规定格式。以下是一个示例代码:importos#指定目录路径directory_path=r'目标文件夹绝对路径'#获取目录下所有文件名files=os.listdir(directory_path)#遍历文件forfile_nameinfiles:#构建完整的文件路径file_path=os.path.join(directory_path,file_name)#检查文件是否是图片文件,并且文件名中包含下划线iffile_name.lower().endswith(('.png','.jpg','.jpeg','.gif'))and'_'infile_name:#分割文件名,以下划线为界parts=file_name.split('_')#确保分割后的第一部分为'00159231127'ifparts[0]!='00159231127':#构建新文件名new_file_name='00159231127'+'_'+'_'.join(parts[1:])#构建新文件路径new_file_path=os.path.join(directory_path,new_file_name)#重命名文件os.rename(file_path,new_file_path)print(f'Renamed:{file_name}->{new_file_name}')1234567891011121314151617181920212223242526272829在上述代码中:1.使用os.listdir获取目录下的所有文件名,然后遍历这些文件名。2.通过os.path.join构建完整的文件路径,确保路径的正确性。3.检查文件是否是图片文件(以.png,.jpg,.jpeg,.gif结尾的文件),并且文件名中包含下划线。4.使用split('_')分割文件名,确保分割后的第一部分为'00159231127'。5.构建新文件名,并使用os.rename来重命名文件。在运行前,请确保备份文件或者在测试环境中运行,以免意外损坏文件。3.检测同级目录下是否存在同名文件夹检测目标路径下的文件夹命名前5位是否存在一样的,如果一样打印出来你可以使用Python来检查指定目录下的文件夹,查找前5位命名相同的文件夹。以下是一个示例代码:importos#指定目录路径directory_path=r'目标路径'#获取目录下所有文件夹名folders=[folderforfolderinos.listdir(directory_path)ifos.path.isdir(os.path.join(directory_path,folder))]#创建一个空字典,用于存储前5位相同的文件夹名same_prefix_folders={}#遍历文件夹forfolderinfolders:#获取前5位文件夹名prefix=folder[:5]#检查前5位文件夹名是否已经在字典中ifprefixinsame_prefix_folders:#将文件夹名添加到对应的键值中same_prefix_folders[prefix].append(folder)else:#若字典中没有该前5位文件夹名,则创建键值对same_prefix_folders[prefix]=[folder]#输出前5位相同的文件夹名forprefix,foldersinsame_prefix_folders.items():iflen(folders)>1:print(f"前5位为'{prefix}'的文件夹有以下重复命名:")print(','.join(folders))1234567891011121314151617181920212223242526272829这段代码执行以下操作:1.使用os.listdir获取指定目录下的所有文件夹名。2.然后遍历这些文件夹名,提取前5位名称,并将具有相同前缀的文件夹放入一个字典中。3.最后打印出前5位相同的文件夹名。Python超详细基础文件操作(详解版)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-9 05:51 , Processed in 0.733938 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表