鱼C论坛

 找回密码
 立即注册
查看: 3761|回复: 19

[技术交流] python小练习(004):淘气的侄子

[复制链接]
发表于 2016-11-15 20:16:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jerryxjr1220 于 2017-2-17 17:31 编辑

昨天的python小练习题目:传送门

我淘气的侄子把我的《罗密欧与朱丽叶》的剧本都弄乱了。

不过还好每个文件中有一个对应的数字依次连接下一个文件,你能顺着数字把我的剧本复原吗?

剧本从1234567.txt开始

请把每个文件的第一个字符按照正确的文件顺序记录下来。

romio.zip (77.19 KB, 下载次数: 148)

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-15 20:49:20 | 显示全部楼层
没啥难度~
1234567.txt -> 43227.txt -> 49220.txt ->...

用正则 \d+
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-15 21:00:25 | 显示全部楼层
本题的确比较简单。遇到一个麻烦是23187.txt,直接按数字找不到文件,只好根据’devide by 2‘,把它C除2。
  1. import re
  2. with open('1234567.txt') as f:
  3.     txt = f.read()
  4. n = 1
  5. print(n, '1234567')
  6. num = re.findall('\d{3,5}', txt)[0]
  7. n += 1
  8. print(n, num)
  9. while True:
  10.     with open(num + '.txt') as f:
  11.         txt = f.read()
  12.     num = re.findall('\d{3,5}', txt)
  13.     if num == []:
  14.         break
  15.     num = num[0]
  16.     if txt.find('devide by 2') != -1:
  17.         num = str(int(num) // 2)
  18.     n += 1
  19.     print(n, num)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-16 07:34:57 | 显示全部楼层
版主大大已经给出了解答,我就不贴了
这题确实不难。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-5 11:19:28 | 显示全部楼层
冬雪雪冬 发表于 2016-11-15 21:00
本题的确比较简单。遇到一个麻烦是23187.txt,直接按数字找不到文件,只好根据’devide by 2‘,把它C除2。 ...
  1. if txt.find('devide by 2') != -1:
  2.         num = str(int(num) // 2)
复制代码

这个是不是判断 txt文件里是否有'devide by 2'?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-5 11:25:06 | 显示全部楼层
墨菲斯托 发表于 2016-12-5 11:19
这个是不是判断 txt文件里是否有'devide by 2'?

是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-5 14:05:06 | 显示全部楼层

为什么
if txt.find('dievide by 2'):
实现不了判断呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-5 14:19:01 | 显示全部楼层
墨菲斯托 发表于 2016-12-5 14:05
为什么
if txt.find('dievide by 2'):
实现不了判断呢?

当找不到时返回-1,不为False,当找到时返回位置索引值,如果是在开头,索引值为0,反而为False。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-5 20:20:31 | 显示全部楼层
冬雪雪冬 发表于 2016-12-5 14:19
当找不到时返回-1,不为False,当找到时返回位置索引值,如果是在开头,索引值为0,反而为False。

不好意思,还是不明白-1的意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-5 20:30:39 | 显示全部楼层
-1就是没有找到这个子字符串。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-6 10:09:27 | 显示全部楼层
冬雪雪冬 发表于 2016-12-5 20:30
-1就是没有找到这个子字符串。

好的,谢谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-16 21:05:44 | 显示全部楼层
正则表达式~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-12 09:59:36 | 显示全部楼层
  1. import os

  2. script_list = []
  3. for i in os.listdir():
  4.     script_list.append(i.split('.')[0])
  5.    
  6. def path_collecter(file_name):
  7.     def name_finder(file_name):
  8.         with open('%s.txt'%file_name) as file:
  9.             contents = file.readline()
  10.             file_name = ''
  11.             for i in range(len(contents)):
  12.                 if contents[i].isdigit() and (contents[i+1].isdigit() or contents[i-1].isdigit()):
  13.                     file_name += contents[i]
  14.             if contents.find('devide by 2') > 0:
  15.                 file_name = int(file_name)//2
  16.             return file_name        
  17.     sequence = []
  18.     while file_name:
  19.         sequence.append(file_name)
  20.         try:
  21.             file_name = name_finder(file_name)
  22.         except IOError:
  23.             for i in script_list:
  24.                 if i in file_name:
  25.                     file_name = i
  26.                     break
  27.             file_name = name_finder(file_name)
  28.     return sequence

  29. if __name__ == '__main__':
  30.     print(path_collecter(1234567))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-25 17:10:52 | 显示全部楼层
import string
data = ''
def main(file_name):
  
    global data
    file_names = ''
    try:
        f = open (r'C:\Users\Administrator\Desktop\romio'+'\\'+file_name+'.txt','r')
    except:
        print('输出完成')
   
   
        
    txt=f.read()
    f.close()
    for each in txt:
                                                               
            if each.isdigit():
                file_names+=each
            else:
                data+=each
   
                    
    print(file_name)
    if file_names and '1985' not in file_names:        
        main(file_names)
   

            
   
        
        
      
if __name__ == '__main__':   
    main('1234567')
    print(data)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-10 16:06:19 | 显示全部楼层
学习一下!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-21 16:55:05 | 显示全部楼层
  1. p=re.compile('\d{2,}')
  2. s=re.findall(p, f.read())
  3. i=1
  4. print("The 1th file is 1234567.txt")
  5. while True:
  6.         f.close()
  7.         i+=1
  8.         f=open('J:\\Mylearning\\day20170221\\%s.txt'%(s[0]))
  9.         S=f.read()
  10.         fout.write(S)
  11.         s=re.findall(p,S)
  12.         if S.find('devide by 2') !=-1:
  13.                 s[0]=str(int(int(s[0])/2))
  14.         if s.__len__()==0:
  15.                 break
  16.         print("The %dth file is %s.txt"%(i,s[0]))
  17. f.close()
  18. fout.close()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-25 20:53:44 | 显示全部楼层
这个题在小练习0那个游戏里好像出现过,还是用re模块匹配

  1. import re
  2. # 在42434.txt的时候会报错一次,要查看文本内容瞅瞅啥情况
  3. filename = "romio\\21217.txt"
  4. # 用新文本记录剧本
  5. script = open("script.txt",'a')
  6. # 文件名看起来至少3位数
  7. p = re.compile(r'[0-9]{3,}')

  8. while True:
  9.     strings = open(filename).read()
  10.     script.write(strings)
  11.    
  12.     num_list = p.findall(strings)
  13.     # 最后没有数字时空列表就会退出循环
  14.     try:
  15.         filename = 'romio\\'+ max(num_list) + '.txt'
  16.     except:
  17.         break

  18. script.close()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-30 19:46:48 | 显示全部楼层
  1. import re
  2. import os
  3. os.chdir("004") #004是存放TXT的文件夹
  4. num=len([i for i in os.listdir()])
  5. print(num)
  6. with open("1234567.txt") as file_now:
  7.         file_now=file_now.read()
  8.         for i in range(num-2):
  9.                 print(file_now)
  10.                 file_next=re.findall(r"(\d{3,})",file_now)
  11.                 if 'devide by 2' not in file_now:
  12.                         with open(file_next[0]+'.txt') as file_next:
  13.                                 file_next=file_next.read()
  14.                 else:
  15.                         with open(str(int(file_next[0])//2)+'.txt') as file_next:
  16.                                 file_next=file_next.read()
  17.                 file_now=file_next
  18. print(file_now)


复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-8 22:19:15 | 显示全部楼层
  1. from zipfile import ZipFile
  2. import re


  3. data = ZipFile('romio.zip', mode='r')
  4. numlist = [1234567]
  5. try:
  6.     while True:
  7.         file_name = str(numlist[-1]) + '.txt'
  8.         file_data = data.open(file_name).read().decode('gbk')
  9.         # print(file_data)
  10.         next_file_name = re.findall('\d{3,6}', file_data)[0]
  11.         if next_file_name == '42434':
  12.             numlist.append(42434 // 2)
  13.         else:
  14.             numlist.append(next_file_name)
  15. except (IndexError, KeyError) as e:
  16.     print(e)
  17. print(len(numlist))
  18. print(numlist)
复制代码


这个类似python  challenge里的zip那题,不过zip读出来的是byte文件,转码'utf-8'的时候,有个文件报了转码错误。
查了一下,改成‘gbk’,就可以了。这中间也类似 python  challenge的有道爬数字的题,中间有个文件里的数是没有的,提示要除以2.
最后检查了一下numlist的长度,跟压缩包里的文件数量对比了一下,都是263.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-9 14:49:58 | 显示全部楼层
本帖最后由 空空3812 于 2018-11-9 14:51 编辑

# -*- coding:utf-8 -*-

import os
import re

file_path='romio/'
file_name='1234567'
file_suffix='.txt'
romio_txt=''

length=len(os.listdir(file_path))
for i in range(length-1):
        with open(file_path+file_name+file_suffix,'r') as f:
                txt=f.read()
                romio_txt=romio_txt+txt
                file_name=re.findall('\d{3,5}', txt)[0]
                if 'please devide by 2' in txt:
                        file_name=str(int(int(file_name)/2))
with open(file_path+'romio'+file_suffix,'w') as f:
        f.write(romio_txt)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 01:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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