python 08 文件操作

news/2024/7/19 9:11:46 标签: python, 爬虫, 操作系统

ctrl + s 保存至磁盘

.exe  .txt   .ppt  .jpg  文件格式

 

open() 函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写 

open(filename, mode)

filename:包含了你要访问的文件名称的字符串值。

mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。  

 

r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

 

 

模式rr+ww+aa+
++ + +
 +++++
创建  ++++
覆盖  ++  
指针在开始++++  
指针在结尾    ++

 

当前文件路径  /Users/magick/python

文件名  mo.txt

文件内容

1 one

2 two

 

>>> f=open(r'/Users/magick/python/mo.txt','r')
>>> f
<_io.TextIOWrapper name='/Users/magick/python/mo.txt' mode='r' encoding='UTF-8'>

>>> list(f)
['1 one\n', '2 two']

 

 f.close()  关闭文件(关闭时缓存文件内容)

为了读取一个文件的内容,调用 f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。

size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回。

f=open(r'/Users/magick/python/mo.txt','r')
print(f.read())

执行结果

1 one

2 two

 

f.readline() 会从文件中读取(当前)的一行。换行符为 '\n'

f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行。

f=open(r'/Users/magick/python/mo.txt','r')
print(f.readline ())

执行结果

1 one

 

f.readlines() 将返回该文件中包含的所有行。

如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割。

f=open(r'/Users/magick/python/mo.txt','r')
print(f.readlines ())

 执行结果

['1 one\n', '2 two']

 

迭代一个文件对象然后读取每行

f=open(r'/Users/magick/python/mo.txt','r')
for l in f:
print(l,end='')

执行结果

1 one

2 two

 

f.write(string) 将 string 写入到文件中, 然后返回写入的字符数。

f=open(r'/Users/magick/python/mo.txt','w')    #w为写入(覆盖)
num = f.write("5")    #用字符串'5'覆盖原文件,字符数为num=1

print(num)      1

f.close()

 

如果要写入一些不是字符串的东西, 那么将需要先进行转换:

f=open(r'/Users/magick/python/mo.txt','w')

num = (2,"a")

n=str(num)
f.write(n)

 

$ cat mo.txt 

(2, 'a')

 

 f.name  查找文件所在系统位置(文件名)

>>> f.name
'/Users/magick/python/mo.txt'

 

 

如果要改变文件当前的位置, 可以使用 f.seek(offset, from_what) 函数。

from_what 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:

 seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符

seek(x,1) : 表示从当前位置往后移动x个字符

seek(-x,2):表示从文件的结尾往前移动x个字符

 f.tell() 返回文件对象当前所处的(指针)位置, 它是从文件开头开始算起的字节数。

f.read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有。

 

>>> f=open(r'/Users/magick/python/mo.txt','rb+')

>>> f.write(b'1234567890')

10


>>> f.seek(5)      移动到第六个
5          第6个(从0开始)
>>> f.read(1)     读取第一个数字 
b'6'
>>> f.tell()      显示当前(指针)位置
6
>>> f.seek(-2,2)   移动到倒数第二个 
8          第9个(从0开始)
>>> f.read(1)     读取第一个数字
b'9'    
>>> f.tell()         当前(指针)位置
9

 

>> f.seek(0,0)    返回最初的位置

>>for e in f:      迭代f的全部内容

  print(e)

 

 

 

 

 

 python文件写入也可以进行网站爬虫

以下代码是打开project.txt文件,并向里面写入http://www.baidu.com网站代码

from urllib import request

response = request.urlopen("http://www.baidu.com/") # 打开网站

fi = open("project.txt", 'w') # open一个txt文件

page = fi.write(str(response.read())) # 网站代码写入

fi.close() # 关闭txt文件

 

 

input() 默认输入的为 str 格式,若用数学计算,则需要转换格式,例:

a=input('请输入数字:') print(a*2)

假设输入数值为3,则上例中得出结果为:

33

若将代码修改为:

a=int(input('请输入数字:')) print(a*2)

则结果为:

6

 

实践

文件内容 

1:1213
2:121321
1:1323
-----
1:22324
2:2232341
1:2242415
-----
1:321515
2:321515
1:315253

 

文件名record.txt

1:开头的单独保存为boy_*.txt

2:开头的单独保存为girl_*.txt

 

不同段落(-----)分割

三段分别保存为

boy_1.txt , boy_2.txt , boy_3.txt

girl_1.txt , girl_2.txt , girl_3.txt

 

 

def save_file (boy,girl,count):
    #保存
    f_name_boy = 'boy_'+ str(count) + '.txt'        #定义名字,用名字提示第几次分割
    f_name_girl = 'girl_'+ str(count) + '.txt'

    boy_file = open(f_name_boy,'w')                 #用定义的名字创建文件
    girl_file = open (f_name_girl,'w')

    boy_file.writelines(boy)                    #把boy的内容写入文件中
    girl_file.writelines(girl)

    boy_file.close()                            #关闭文件
    girl_file.close()

def split_file(file_name):
    #分割
    f= open('record.txt')

    boy = []
    girl = []
    count = 1

    for e in f:
        if e[:5] != '-----':
            (role,l) =e.split(':',1)    #e.split(':',1) :的左右分割,左role,右l
            if role == '1':
                boy.append(l)           #写入boy,此时boy为列表
            if role == '2':
                girl.append(l)          #写入girl列表
        else:
            save_file(boy,girl,count)       #此时迭代至分割线,把上一轮的列表数保存
            boy=[]                      #带入保存函数,清空列表
            girl=[]
            count += 1                  #进入下一次分割        
                                
    save_file(boy,girl,count)           #跳出迭代,保存最后一组数据

    f.close()                           #关闭文件

split_file('record.txt')      

 

整体思路:

准备两个列表

  迭代文件

    没有遇到分割线时

      :左右分割,符号条件的放到对应列表中

    遇到分割线时保存列表数据至文件,回到迭代判断处,准备下一次

保存文件可使用函数dfl

用名字提示第几次分割

创建文件

把数据写入文件中

关闭文件

所以要接收数据,第几次分割

 

 

 

模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py

模块可以被别的程序引入,以使用该模块中的函数等功能(标准库)

有os模块,不用关心操作系统下使用什么模块

os模块会自动选择正确的模块并调用

>>import os  #引用os模块

>>os.getcwd()  #当前工作目录

'/Users/magick/python'

 

>>> os.chdir('/Users/magick')  #修改工作目录,移动
>>> os.getcwd()
'/Users/magick'

 

>>> os.listdir()    #列举当前目录的文件
['Music', '.DS_Store', '.CFUserTextEncoding', '.idm', 'python', 'Pictures', 'Desktop', 'Library', '.bash_sessions', '.mplayer', 'PycharmProjects', 'Public', '.dropbox', 'Python 3.7', '.idlerc', 'Movies', 'Applications', 'Dropbox', '.Trash', 'Documents', '.bash_profile', 'Downloads', '.bash_history', '.viminfo']

 

>>> os.mkdir('/Users/magick/a')    #创建单层目录(文件)

>>> os.mkdir('/Users/magick/a/b')    #a存在的情况下创建b

>>> os.mkdir('/Users/magick/c/b')    #不存在c,所以不能在c中创建b,报错

 

>>> os.mkedirs('/Users/magick/a/b')    #递归创建多层目录,需要包含子目录

 

>>> os.rmdir('/Users/magick/a/b')    #删除路径目录,仅当这个文件夹是空的才行

 

>>> os.mkdir('/Users/magick/python/a/a')
>>> os.mkdir('/Users/magick/python/a/a/a')
>>> os.mkdir('/Users/magick/python/a/a/a/a')

>>> os.removedirs('/Users/magick/python/a/a/a/a')  #递归删除目录如果子文件夹成功删除尝试它们的父文件夹

>>> os.listdir() 
['c', 'b']

 

 

>>> os.listdir()      
['.DS_Store', 'c', 'b']
>>> os.unlink('.DS_Store')    #删除文件,如果文件是一个目录则返回一个错误

>>> os.listdir()      
['c', 'b']

 

>>> os.listdir()
['c', 'b']
>>> os.rename('c','a')    #命名(修改)文件或目录
>>> os.listdir()
['a', 'b']

 

os.curdir    指代当前目录

os.pardir    指代上一级目录

 

os.path 模块

import os  引用os模块时就已经引用了os.path

 

>>os.path.basename('/Users/magick/a.txt')    #去掉目录路径,单独返回文件名

a.txt

>>>>os.path.basename('/Users/magick/a.txt')    #去掉文件名,单独返回目录路径

/Users/magick

>>os.path.join('c:\\','a','b')      #各部分组合成一个路径名

c:a\\b

>>os.path.split('c:\\a\\b.txt')    #分割文件名与路径

('c:\\a','b.txt')

>>os.path.splitext('c:\\a\\b.txt')    #分离文件名与扩展名

('c:\\a\\b','txt')

 

 

os.getatime  返回指定文件最近的访问时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)

import time

os.path.getatime('c:\\a\\b.txt')      返回浮点型秒数

time.gmtime(os.path.getatime('c:\\a\\b.txt'))    返回日期

 

os.getctime(file)  返回指定文件的创建时间

os.getmtime(file)  返回指定文件最新的修改时间

 

转载于:https://www.cnblogs.com/17s4029/p/9519595.html


http://www.niftyadmin.cn/n/1110619.html

相关文章

关于内核线程(kernel_thread)(转)

关于内核线程(kernel_thread)(转)[more]我们知道Linux内核使用内核线程来将内核分成几个功能模块, 像kswapd,kflushd等,系统中的init进程也是由idle进程调用 kernel_thread()来实现产生的. 我们先来看看内核线程的实现,再来分析内核线程的性质. int kernel_thread(int(*fn)(voi…

UNIX系统的桌面环境:KDE相关介绍(转)

UNIX系统的桌面环境&#xff1a;KDE相关介绍(转)[more]KDE是UNIX操作系统下的一个网络透明的现代桌面环境。UNIX工作站需要一种像MacOS和微软WINDOWS的桌面环境那样的易于使用的桌面&#xff0c; KDE因此诞生。我们相信UNIX操作系统是现今最好的操作系统。事实上多年以来UNIX一…

UVA 12338 Anti-Rhyme Pairs(hash + 二分)题解

题意&#xff1a;给出两个字符串的最大相同前缀。 思路&#xff1a;hash是要hash&#xff0c;不hash是不可能的。hash完之后从头遍历判断超时然后陷入沉默&#xff0c;然后告诉我这能二分orz&#xff0c;二分完就过了&#xff0c;写二分条件写了半天。不要用数组储存hash值&…

Linux桌面:GNOME工程提供的两样东西(转)

Linux桌面&#xff1a;GNOME工程提供的两样东西(转)[more]GNOME&#xff1a; GNU Network Object Model Environment GNOME工程提供了两样东西: 一是GNOME Linux桌面环境, 一套为最终用户和GNOME 开发平台准备的直观且充满诱惑力的桌面; 二是用于创建易于集成到桌面环境中的应用…

JavaMail学习笔记(二)、JavaMail API简介和配置开发环境

一、JavaMail API 简介 JavaMail API是Sun公司为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包&#xff0c;它支持一些常用的邮件协议&#xff0c;如&#xff1a;SMTP、POP3、IMAP和MIME等。开发人员使用JavaMail API编写邮件处理软件时&#xff…

4.Java基础:Java对象的内存管理机制

1.使用new创建对象&#xff0c;在堆内存分配对象空间、初始化&#xff1b; 2.在方法栈中定义局部变量&#xff0c;吃用对堆内存中对象的引用&#xff1b; 3.方法执行完返回&#xff0c;栈内存自动释放&#xff0c;局部变量销毁&#xff1b; 4.如果堆内存中对象没有变量引用它&a…

安装bcmath 扩展

1、在php源码包中&#xff0c;默认就包含bcmath扩展的安装文件&#xff0c;只需手动安装一下即可 cd /root/build2/php-7.2.4/ext/bcmath // 进入PHP的源码包目录中的bcmatch扩展目录/usr/local/php/bin/phpize // 执行phpize命令./configure --with-php-config/usr/local/php…

cmd输入npm没反应,npm install 没反应

就光标一直闪 而输入node -v是正常的 卸载重装&#xff0c;还是这样&#xff0c;最后发现了&#xff0c;C:\Users&#xff08;用户&#xff09;\你的用户名\.npmrc 这个文件中&#xff0c;是这样的 prefixE:\Programming 然后什么都没有&#xff0c;而我是安装在prefixE:\Prog…