Python踩坑指南(第一季)

最近在python开发的过程中,发现了一些比较有意思的问题,确实让自己在开发过程中被恶心了一把,所以开了这个连续的更新博文,之后会持续的按第一第二第三这种版本下去,更新一些比较有意思的python代码问题。

1
2
with open('/path/to/file', 'r') as f:
print(f.read())

IO读取采用with形式,避免忘记close,否则会产生很神奇的结果


1
embereding_data.drop_duplicates(keep='first',inplace=True)

python 中删除重复项 如果在原来数据上删除重复项,就要加入inplace=True
否则 只是保存一个副本!!!


1
pd.read_csv(filename,error_bad_lines=False)

pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 3, saw 2解决办法
在使用pandas读取csv文件时报以上错误,解决办法如左
加上error_bad_lines=False就可以完美解决了


1
str = " ".join(list(map(str, l)))

myList = [‘a’,’b’,’c’,’d’] myString = “,”.join(myList ) 当myList含有数字的时候这种方法就会报错 因此需要转为str


1
json.loads('key':value)

value不可以为set、tuple


1
2
3
4
d3='{"Message":"已注销帐户。\r\n\r\n使用者:\r\n\t安全"}'
j=json.loads(d3,strict=False,encoding='utf-8')
print(type(j)) #返回值:<type 'dict'>
print(j['Opcode'].encode('u8')) #返回值:信息

使用json.loads时,如果原字符串中包含有 \r\n\t等字符,则会提示报错,
修改参数strict=False即可

说明:”If strict is False (True is the default), then control characters will be allowed inside strings. Control characters in this context are those with character codes in the 0-31 range, including ‘\t’ (tab), ‘\n’, ‘\r’ and ‘\0’.”


1
2
data['county_route_index'] = data.apply(lambda x: str(x.start_county_cd) + '_' + str(x.end_county_cd),
axis=1)

生成county_route_index字段示例310112.0_320583.0,而start_county_cd、end_county_cd为整型(int64)
解决办法:
1.str(x.start_county_cd)改为str(int(x.start_county_cd))
2.df[‘col3’] = df[‘col1’].map(str) + ‘_’ + df[‘col2’].map(str)


1
2
3
4
5
6
7
8
arr = (12,[1,3,3,4],'b')
arr[1]+=[6]

---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-15-6bc7f041d391> in <module>()
----> 1 arr[1]+=[6]
TypeError: 'tuple' object does not support item assignment

但是实际上却操作成功:

1
2
In [16]: arr
Out[16]: (12, [1, 3, 3, 4, 6], 'b')

不要混合使用list和tuple的时候使用concat操作


1
2
3
4
5
6
7
def func(a,b):
if a ==1:
return b
else:
return 1-b

bbs_data["real_label"] = bbs_data.apply(lambda row:func(row[2],row[3]),axis = 1)

dataframe 某列的值根据其他列的值计算得来


1
2
3
4
5
6
7
8
9
10
pRec = {}
import functools

def check_is_key_param(f):
global pRec
@functools.wraps(f)
def wrapper(*args, **kwargs):
pRec.update(f(*args, **kwargs))
return f(*args, **kwargs)
return wrapper

收集计算过程中的中间数据

我觉得python确实是比较容易入门的语言,代价是它带来的不稳定性确实也是比较高,需要积累踩坑

欢迎大家关注我的个人bolg知乎,更多代码内容欢迎follow我的个人Github,如果有任何算法、代码、转行疑问都欢迎通过公众号发消息给我。

打赏的大佬可以联系我,赠送超赞的算法资料