8.文件相关练习--比较两个文件的不同

1.比较两个文件内容:
实现下述功能:
–比较两个输入文件中若有不同显示不同处行号和第一个不同字符的位置

请输入需要比较的头一个文件名:something1.txt
请输入需要比较的另一个文件名:something2.txt
两个文件共有[ 2 ]处不同:13 行不一样,第一个不同字符的位置是第 6 个字符
第 14 行不一样,第一个不同字符的位置是第 5 个字符

代码实现:

file_name_1 = input('请输入需要比较的头一个文件名:')

file_name_2 = input('请输入需要比较的另一个文件名:')

#编写文件名
file_name_final_1 = 'C:/Users/X/Desktop/' + file_name_1
file_name_final_2 = 'C:/Users/X/Desktop/' + file_name_2

#以只读打开文件获取文件内容
f_1 = open(file_name_final_1)
f_2 = open(file_name_final_2)

#对于不同行元素的判断,可以直接用文件内容进行比较
differ = []#存储不同行的位置
differ_str = []#存储不同行第一个字符对应位置

#两个字符串比较,找出第一个不同字符的位置
def bijiao(str1, str2):
    for index in range(min(len(str1), len(str2))):
        if str1[index] != str2[index]:
            break
    return index + 1

count = 1
for line1 in f_1:
    line2 = f_2.readline()#从文件中读取并返回一行
    if line1 != line2:
        differ.append(count)
        differ_str.append(bijiao(line1, line2))
    count += 1

if len(differ) != 0:
    print('两个文件共有【%d】处不同' % len(differ))
    for i in range(len(differ)):
        print('第 %d 行不一致, 不一致行第一个不同字符是第 %d 个字符' % (differ[i],differ_str[i]))

小结:
(1)注意文件方法中:readline()方法
(2)比较不同字符串筛选出第一个不同字符位置的bijiao()函数

2.根据用户输入的行数打印文件对应内容:
实现功能:
–输入文件名和指定行数显示文件内容

请输入要打开的文件(C:/test.txt):something1.txt
请输入要显示的该文件前几行:3:6

文件something1.txt从36的内容如下:

从明天起,关心粮食与蔬菜
我有一所房子,面朝大海,春暖花开

从明天起,和每一个亲人通信

代码实现:

file_name = input('请输入要打开的文件(C:/test.txt):')

num = input('请输入要显示的该文件前几行:')


file_name_final = 'C:/Users/X/Desktop/' + file_name
#以可读方式打开对应的文件
f = open(file_name_final)

(begin, end) = num.split(':', 1)

if num.strip() == ':':#num.strip()为去除num中的空格后的字符串
    begin = '1'  #定义begin值为'1'
    end = '-1'   #定义end值为'-1'

if begin == '': #此时为类似于':3',即1-3行
    begin = '1' 
if end == '':    #此时为类似于'3:',即3-末尾
    end = '-1'

if begin == '1' and end == '-1':
    prompt = '的全文'
elif begin == '1':
    prompt = '从开始到%s' % end
elif end == '-1':
    prompt = '从%s到结束' % begin
else:
    prompt = '从%s到%s' % (begin ,end)


print('\n文件%s%s的内容如下:\n' % (file_name, prompt))

begin = int(begin) - 1
end = int(end)
lines = end - begin

#打印内容begin-end的
#读取begin前的内容,进行指针化
for i in range(begin):
    f.readline()

#分析:
#(1) ':',begin = 0, end = -1, end - begin < 0,begin之前的内容为空-->打印全部内容
#(2) ':3',begin = 0, end = 3, end - begin = 3 > 0 ,,begin之前的内容为空, 打印1-3行内容
#(3) '2:',begin = 2, end = -1, end - begin = -3 < 0,begin之前为前两行消耗掉,然后打印剩下全部内容
#(4) '4:7',begin = 4, end = 7, end -begin = 3 > 0,beigin之前3行消耗掉,然后打印4-7行
#综上所述,当lines < 0时,打印begin()消耗掉内容的剩余全部
        #当lines >= 0时,打印从消耗部分开始的end-begin行内容


if lines < 0:
    f.read()
else:
    for each in range(lines):
        print(f.readline(),end = '')

f.close()

小结:
(1)文件读取内容时按行读取,有指针控制。

#f为一个以只可读方式打开的文件
for i in range(5):
	f.read()
#此时文件会每一次运行for循环的时候进行一行内容的读取,上述代码会读取f文件中的前5行,此时文件会在下次循环的时候从第6行开始
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值