一、实验目的及要求
(1)掌握数据文件操作的一般流程;
(2)理解数据编码和解码的含义;
(3)掌握文本数据文件常用的数据读写方法;
(4)掌握二进制数据文件常用的数据读写方法;
(5)能够根据要求实现对数据文件的读取和分析。
二、实验仪器设备与软件环境
1.安装有Win7/Win10微型计算机系统,每人一台;
2.每台微型计算机系统连接Internet网络;
3.安装有Python IDLE。
三、实验内容
1、在只打开给定的data.txt文件一次的情况下,实现对文件内容的两次读取:第一次连续读取全部奇数行的数据并输出;第二次连续读取全部偶数行的数据,对数据进行utf-8编码后输出。
with open("C:\\Users\\86175\\Desktop\\实验5 文件的操作和异常处理\\data.txt") as fp:
#fp = open('C:\\Users\\86175\\Desktop\\实验5 文件的操作和异常处理\\data.txt', 'r')
odd_result = []
even_result = []
for idx, line in enumerate(fp, start=1):
if idx % 2 == 0:
even_result.append(line)
else:
odd_result.append(line)
for j in odd_result:
print(j.encode('utf8'))
for k in even_result:
print(k.encode('utf8'))
encode() 方法使用指定的编码对字符串进行编码。如果未指定编码,则将使用 UTF-8。
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
2、输入一个路径,输出该路径下的所有文件列表;计算实验数据目录中的sea.jpg图片文件的大小并输出;对实验数据目录中的osData.txt文件进行操作:判断osData.txt文件是否存在,如果存在则在文件的末尾追加“I am ok.”字符串,如果文件不存在,则通过程序建立新文件并在文件中写入“My name is jack ”。
import os
#print(os.listdir(r'C:\\Users\\86175\\Desktop\\实验5 文件的操作和异常处理'))
dirs = os.listdir(r'C:\\Users\\86175\\Desktop\\实验5 文件的操作和异常处理')
for file in dirs:
print (file)
from PIL import Image
img = Image.open(r'C:\\Users\\86175\\Desktop\\实验5 文件的操作和异常处理\sea.jpg')
print(img.size)
if os.path.exists(r'C:\\Users\\86175\\Desktop\\实验5 文件的操作和异常处理\osData.txt'):
with open(r'C:\\Users\\86175\\Desktop\\实验5 文件的操作和异常处理\osData.txt', 'a') as f:
f.write('I am OK')
else:
with open(r'C:\\Users\\86175\\Desktop\\实验5 文件的操作和异常处理\osData.txt', 'a') as f:
f.write('My name is Jack')
os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os, sys
# 打开文件
path = "/var/www/html/"
dirs = os.listdir( path )
# 输出所有文件和文件夹
for file in dirs:
print (file)
利用 img = Image.open(ImgPath) 打开的图片是PIL类型的,它自带resize函数。由于pytorch的顺序是(batch,c,h,w),所以需要进行PIL类型到numpy类型转换,tensorflow,numpy的顺序是(batch,h,w,c)
os.path模块主要用于文件的属性获取,exists是“存在”的意思,所以顾名思义,os.path.exists()就是判断括号里的文件是否存在的意思,括号内的可以是文件路径。
3、编写程序接收用户输入的水果销售单价和数量,计算并输出水果的销售总额。要求程序能够捕获并处理当用户输入非数值类型的单价和数量时系统产生的异常,当捕获到异常时,使用单价和数量的默认值0进行总额的计算,并给用户输出相应的错误提示信息。
count = int(input("Enter count: "))
price = float(input("Enter price for each one: "))
Pay = count * price
print("The price is: ", Pay)
a = " "
price = []
amount = []
while a != "":
a = input().split(" ")
if a[0] == "":
break
try:
a = list(map(lambda b: float(b), a))
except:
print("Error detected.")
a[0] = 0
a[1] = 0
price.append(a[0])
amount.append(a[1])
sumA = 0
for i in range(len(price)):
sumA += price[i] * amount[i]
print(sumA)
4、读取给定的score.txt中保存的分数信息,按用户输入的学号或者姓名对学生的信息进行查询和输出(用户只输入一个查询数据),要求实现模糊条件查询,如姓胡的同学的成绩,学号中包括19字符的同学的成绩,将查询到的学生学号、姓名、总成绩写入到sum_score.csv文件。
import operator as op
k = input()
with open(r'C:\Users\62749\Downloads\Compressed\实验5 文件的操作和异常处理\实验5 文件的操作和异常处理\score.txt', "r") as f:
for line in f.readlines():
if op.contains(line, str(k)):
print(line)
contains 方法可以判断子串是否在原字符串中。
# 导入operator模块
import operator
#调用 operator 中的 contains 方法,判断子串是否在原字符串中。是,则返回True 否,返回 False
print(operator.contains('Hello world!','wor')) #True
print(operator.contains('Hello world!','woc')) #False
5、编写程序实现:在实验数据目录中建立子目录copyImg;将实验数据目录中的sea.jpg图片文件拷贝10份到建立的copyImg目录中,文件名依次为seaCopy1.jpg , … , seaCopy10.jpg。
import os
f_obj=open(r"C:\Users\62749\Downloads\Compressed\实验5 文件的操作和异常处理\实验5 文件的操作和异常处理\sea.jpg",'rb')
f_content=f_obj.read()
os.makedirs(r'C:\Users\62749\Downloads\Compressed\实验5 文件的操作和异常处理\实验5 文件的操作和异常处理\copylmg')
for i in range(1,11):
b='sea-copy'+str(i)+'.jpg'
fnew=open(r"C:\Users\62749\Downloads\Compressed\实验5 文件的操作和异常处理\实验5 文件的操作和异常处理\copylmg"+b,'wb')
fnew.write(f_content)
fnew.close()
print('图片已成功拷贝.')