栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

用python写程序的一些小积累(3)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用python写程序的一些小积累(3)

  看了别人写的博客后的一点感想:花一早上看了python教程和爬虫教程博客,写的巨长,期间好几次忍不住去玩手机了。看别人写的博客适合短平快的学习:当你了解一个知识的时候,去看看别人写的这方面的博客可以当成复习或查漏补缺、或者新手入门、或者遇到bug怎么解决。如果想要系统的了解知识还是建议找几本好书看看。为什么csdn上这么多教程了,或许我写的这些别人早就写过了,我还要写吗?那我岂不是做了知识的搬运工?但我觉得还是有必要写一写自己学习过程的总结,给自己看,遇到相同问题的时候能够很容易查找到解决办法。

目录
  • 1. 文件夹中有多个txt文件,怎么读取里面的数据
  • 2. yield()函数
  • 3. python爬取内容出现中文乱码的解决方法
  • 4. python怎么判断字符串是否以数字开头?
  • 5. 如何去除换行符n以及制表符t等等?
    • 5.1 re.sub()
    • 5.2 re模块怎么批量替换字符串中的多个字符?
  • 6. 网页爬虫中出现u3000等字符怎么去除?

1. 文件夹中有多个txt文件,怎么读取里面的数据
  1. 将多个txt文件里的内容进行合并
# -*- coding:utf-8 -*- 
#os模块中包含很多操作文件和目录的函数 
import os 

#获取目标文件夹的路径 
meragefiledir = os.getcwd()+'\MerageFiles'
#获取当前文件夹中的文件名称列表 
filenames=os.listdir(meragefiledir) 
#打开当前目录下的result.txt文件,如果没有则创建
file=open('result.txt','w') 
#向文件中写入字符 
  
#先遍历文件名 
for filename in filenames: 
	filepath=meragefiledir+'\'
	filepath=filepath+filename
 	#遍历单个文件,读取行数 
	for line in open(filepath): 
		file.writelines(line) 
	file.write('n') 
#关闭文件 
file.close()
  1. 如果只是想读取每个文件的内容再进行数据处理的话,可以用startswith进行判断。
path = 'result2/'
file_names = os.listdir(path)
for file in file_names:
	if file.startswith('link_1'):
		pass
	elif file.startswith('link_2'):
		pass
	else:
		continue
2. yield()函数

yield()函数是创建生成器的一种方式。前面总结过用列表推导式来创建列表,但将[]改为()后就可以创建生成器了。

a = (i for i in range(5) if i > 3)
print(a)             #  at 0x00000196A1AAF948>
print(next(a))       # 4
def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        print(b)
        a, b = b, a + b 
        n = n + 1
fab(5)
>>> 1
	1
	2
	3
	5
def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b     # 将print换成yield
        a, b = b, a + b 
        n = n + 1
f = fab(5)
print(f)    # 
print(next(f))   # 1
for i in f:    # 通过遍历将生成器中的元素打印出
    print(i)
>>> 1
    1
    2
    3
    5

通过上面的代码可以体会到yield()不是一下子把程序执行完,而是返回一个生成器,当用next()或循环调用一次就执行一次,碰到yield()之后返回值,如果再调用,那就从上一步yield断开的地方再执行,直到再次遇到yield()。

换一个更容易看出区别的例子:

def fun():
    a = 10
    while 1:
        a += 1
        yield a


b = fun()
print(next(b))
print(next(b))
print(next(b))

>>> 11
    12
    13

如果将yield a 换成print(a),程序就会陷入死循环。这就体现了yeild()利用资源的优势了。

3. python爬取内容出现中文乱码的解决方法

出现中文乱码的原因是因为源网页编码不是‘utf-8’,我尝试了这个博客的第1第2种方法,第一种虽然可以解决乱码变正常码的问题,但是原来正常码的变为乱码了。第二种方法完美解决。第三种编码再解码在爬虫中很常用,但我觉得有亿点点麻烦。
参考博客如下:Python爬取网站返回的内容为乱码解决方法

4. python怎么判断字符串是否以数字开头?

之前写过用str.startswith(‘xxx’)或str.endswith(‘xxx’)来判断字符串是以什么字符开头和结尾的,但是有个问题是:如果这些字符串的开头和结尾都是变化的数字怎么处理(变化的字母也同理)?用str.startswith(‘xxx’)把所有的情况都罗列一遍么?[笑cry]

link = '03243'
if link[0].isdigit():
	print('yes')

判断是否以字母开头:str[0].isalpha()

5. 如何去除换行符n以及制表符t等等?

之后会对正则进行总结,但我先挑一些我遇到的问题,以及怎么解决的。说去除其实是用空格进行替换。

5.1 re.sub()
import re

text = '今天n很n开心'
# print(text)
# >>> 今天
#     很
#     开心

a = re.sub(r'n', '', text)       # 去掉了所有的n 
# print(a)         # 今天很开心

b = text.replace(r'n', '')
# print(b)
# >>> 今天
#     很
#     开心

c = text.replace(r'今天', '天天')
print(c)
# >>> 天天
#     很
#     开心

从上面的例子可以看到str.replace()与re.sub()的区别。

5.2 re模块怎么批量替换字符串中的多个字符?
import re
s = '“你好啊,_我是小黑@*$”'
parttern = re.compile('“|”|,|_|@|*|$')  # | 表示或者的意思
print(re.sub(parttern, '', s))  # 替换掉s里面的满足parttern格式的字符为空白字符
# >>> 你好啊我是小黑
6. 网页爬虫中出现u3000等字符怎么去除?
import unicodedata
s = 'T-shirtxa0xa0短袖圆领衫,u3000体恤衫xa0买一件t吧'
print(unicodedata.normalize('NFKC', s))
# >>> T-shirt  短袖圆领衫, 体恤衫 买一件      吧

我用到的是unicodedata模块提供的normalize方法,还有其它几种方法,比如使用上面的re.sub()等等,但这种方法是处理这种情况最好的方法。
参考资料:网页爬虫中xa0、u3000等字符的解释及去除

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/339895.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号