Python基础之文件操作

日期和时间

time和datetime是Python处理日期和时间的标准库。
时间间隔是以秒为单位的浮点小数。
每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示。

time模块

time()函数获取当前时间戳,函数time.time()用于获取当前时间戳:

import time

#显示从1970年1月1日以来的事件,单位为秒
print(time.time())

localtime([seconds])格式化时间戳为本地时间,返回时间元组

import time
print(time.localtime(time.time()))

time.strftime(format[, time_tuple])格式化日期函数

# 格式化成2018-04-14 21:46:50形式
print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

# 格式化成Sat Apr 14 21:46:50 2018形式
print (time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))

time.strptime(string, format)将日期时间字符转换为时间元组

import time
struct_time = time.strptime("21-Nov-08", "%d-%m-%Y")
print("Time Tuple:",struct_time)

struct_time = time.strptime("2015-03-05","%Y-%m-%d")
print("Time Tuple:",struct_time)

time.mktime(time_tuple)将时间元组转换成时间戳

# 将格式字符串转换为时间戳
a = "Sat Apr 14 21:46:50 2018"
print (time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y")))

time.sleep(seconds)程序睡眠等待几秒钟

#sleep(秒)程序睡眠时间
start_time = time.time()
time.sleep(5)
end_time = time.time()
print(end_time - start_time)

很多Python函数用一个元组装起来的9组数字处理时间

序号 属性 字段
0 tm_year 4位数年 例如:2008
1 tm_mon 1-12
2 tm_mday 1-31
3 tm_hour 小时 0-23
4 tm_min 分钟 0-59
5 tm_sec 0-61 (60或61是闰秒)
6 tm_wday 一周的第几日 0到6(0都是周一)
7 tm_yday 一年的第几日 1-366(儒略历)
8 tm_isdst 夏令时 -1,0,1,-1未知,1(夏令时)、0(不是夏令时)

datetime模块

使用datetime模块来获取当前的日期和时间
datetime.datetime.now()获取当前日期和时间

import datetime
print("datetime=", datetime.datetime.now())

strftime(format)日期时间格式化

#strftime(format)可以格式化时间
print("datetime=", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

datetime.datetime.fromtimestamp(timestamp)将时间戳转换为日期时间

import time
import datetime
ts = time.time()
#将当前时间戳转换为日期时间格式
c_t = datetime.datetime.fromtimestamp(ts)
print("Current Time=", c_t)

datetime.timedelta(时间间隔)返回一个时间间隔对象,通过时间间隔可以对时间进行加减法得到新的时间

import datetime
#取今天的日期和时间
today = datetime.datetime.today()
print("today={}".format(today.strftime("%Y-%m-%d %H:%M:%S")))
#计算一天前时间间隔
timedelta = datetime.timedelta(days=1)
#今天的日期时间-timedelta,得到昨天的日期时间
yesterday = today - timedelta
print("yesterday={}".format(yesterday.strftime("%Y-%m-%d %H:%M:%S")))

时间戳单位最适于做日期运算。但是1970年之前的日期就无法以此表示了。太遥远的日期也不行,UNIX和Windows只支持到2038年。

文件操作

文件操作最重要的就是文件读写,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。

读文件
open(文件路径,访问模式,endcoding=编码格式)方法打开一个已存在的文件,或者创建新的文件

fp.open('test.txt','r',encoding='utf-8')

close()方法关闭已打开的文件
打开文件常用的三种访问模式
r:只读模式(默认)
w:只写模式
a:追加模式

write(data)方法向文件中写入字符串,在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。 write()方法语法如下:

fileObject.write([str])

read()方法读取文件全部内容

readlines()方法读取文件全部内容,放回一个列表,每行数据是列表中的一个元素
readline()方法按行读取文件数据
writelines(字符串序列)将一个字符串序列(如字符串列表等)的元素写入到文件中
os.rename(oldname, newname)文件重命名
os.remvoe(filepath)删除文件
安全的打开关闭文件的方式(自动调用close方法):

with open("d://test.txt","w") as f:
    f.write("hello python")
import sys
import json
result_file='/tmp/user_json.txt'
for i in range(len(sys.argv)):
      print(sys.argv[i])
if len(sys.argv)<2:
      print("Not Enough Parameters!")
      sys.exit(1)
#将第一个参数做为文件路径传入fp函数,以只读方式打开。FP所指的文件是一个JSON格式的文件
try:
        fp=open(sys.argv[1],'r')
except OSError as reason:
        print('str(Exception):\t', str(reason))
        print("Read File Error")
try:
        fp_dump=open(result_file,'w')
except:
        print("Create File for Modification Error")
i = 0
#读入fp所指的文件
line = fp.readline()
#line不为空则继续循环
while line:
        i += 1
#将一行内容读入,转成Python的字典类型数据,便于处理
        data = json.loads(line)
        print("line{:<5d}:{}".format(i,data))
        print("No{:d=},cardName={}".format(i,data["cardName"]))
        fp_dump.write("i={},data={}\n".format(i,data['driverName']))
        #读入fp所指的文件,每次循环读一行
        line = fp.readline()
fp.close()
fp_dump.close()

文件夹操作

os.mkdir(path)创建文件夹
os.getcwd()获取程序运行的当前目录
os.listdir(path)获取指定目录下的文件列表
os.rmdir(path)删除空文件夹
shutil.rmtree(path)删除非空文件夹
os.chdir(path)切换目录

import os
#创建目录
os.mkdir("/tmp/python")
#将制定目录下内容导入到一个列表中
list=os.listdir("/tmp")
print("list={}".format(list))
#显示当前目录
print("current_directory={}".format(os.getcwd()))
#删除目录
os.rmdir("/tmp/python")
#将tmp目录中的文件user_json.txt改名为example.txt
os.rename("/tmp/user_json.txt","/tmp/example.txt")
#显示目录删除后的结果
list=os.listdir("/tmp")
print("list after python direcotry being removed: {}".format(list))
#删除example.txt文件
os.remove('/tmp/example.txt')

JSON格式文件操作

json模块主要用于对json格式进行处理,最主要的是dumps、dump、loads和load函数。

dump和dumps用于把pyhton数据转换为json字符串,dumps只能操作数据,dump可以在处理数据之后,同时写入文件。

load和loads用于把json数据转换为python数据,loads可以把一个json字符串转为python数据,load则可以把一个json文件中的数据读出来进行转换。

引入json模块:import json
dumps(python_data)将Python数据转换为JSON编码的字符串
loads(json_data) 将json编码的字符串转换为python的数据结构
dump(python_data, file)将Python数据转换为JSON编码的字符串并写入文件
load(json_file)从JSON数据文件中读取数据,并将json编码的字符串转换为python的数据结构

import json
#定义一个python数据字典
data={"orgNo":"E000002","dirverPhone":"13800138000","driverName":"李四","cardName":"张三","cardFaceURL":"http://file.example.com:5077/group1/M00/04/70/abcdfssass.jpg","authdt":"2017-04-12"}
#打印字典
print(type(data))
#将字典转换为json字符串
ad = json.dumps(data)
print("ad={}".format(ad))
#打印字符串类型
print(type(ad))
#将Python字符串转换为字典数据
al = json.loads(ad)
#打印字典数据以及类型
print("al={}".format(al))
print(type(al))

Python数据类型与JSON类型对比

Python JSON
dict {}
list,tuple []
str string
int,float number
True,False true,false
None null

CSV格式文件操作

csv格式文件默认以逗号分隔的若干字段文本的形式,有标题行 使用前,需要首先import进csv模块:import csv
writerow([row_data])一次写入一行数据

import csv
with open("文件名","打开方式"):
    writer = writer.writerow(f)
    for item_list in list:
        writer.writerow(item_list)

writerows([row_data],[row_data],[row_data],...)一次写入多行数fi据

import csv
csv_list=[["UserName","Password","Name","Age","Score"],["User1","123456","Smith",18,102],["User2","654321","Chandler",20,110],["User3","000000","Rachel",19,115]]
csv_tuple=(("UserName","Password","Name","Age","Score"),("User1","123456","Smith",18,102),("User2","654321","Chandler",20,110),("User3","000000","Rachel",19,115))
csv_dict={"username":"user1","name":"zhangsan","age":18,"score":{"Maths":"100","Cinese":"100"}}

#用writerow方法,循环写入
with open('/tmp/csv.txt','w',newline="",encoding="utf-8") as f:
        writer = csv.writer(f)
        for row in csv_list:
                writer.writerow(row)

#用writerows方法,无需循环,直接一次性写入,每个列表占一行
with open('/tmp/csv_1.txt','w',newline="",encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerows(csv_list)

#如果是一个列表元组,则同样可以用writerows一次性写入;如果用writerow方法,则会把这个元组的所有元素写入一行,不符合要求
with open('/tmp/csv_2.txt','w',newline="",encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerows(csv_tuple)

#如果是字典,则字典的每个键的所有字符打开,用逗号分隔,单独占一行;而值舍去
with open('/tmp/csv_3.txt','w',newline="",encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerows(csv_dict)

reader(file_object)根据打开的文件对象返回一个可迭代reader对象

with open('/tmp/csv.txt','r') as f:
        #定义一个reader实例
        reader = csv.reader(f)
        #读入一行,并把reader的指针移动到下一行
        header = next(reader)
        print(header)
        print("-----------")
        #将当前指针位置以后的reader对象逐行独处并打印
        for row in reader:
                print(row)
                print(row[0])
                print(row[1])
                print(row[2])
                print(row[3])
                print(row[4])

可以使用next(reader)遍历reader对象,获取每一行数据

DictWriter和DicReader对象处理Python字典类型的数据,针对字典类型的数据,reader和writer不能处理,为此,csv中专门引入了DictWriter和DictReader方法对python类型数据进行处理:

header = ["name","age"]
rows = [{"name":"zhangsan","age":20},{"name":"lisi","age":30},{"name":"wangwu","age":18}]

with open("d://user_info_csv_dict.csv","w",newline="",encoding="utf-8") as f:
    writer = csv.DictWriter(f,header)
    writer.writeheader()
    writer.writerows(rows)

with open("d://user_info_csv_dict.csv","r",newline="",encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row)
        print("name:{},age:{}".format(row["name"],row["age"]))