鱼C论坛

 找回密码
 立即注册
查看: 2325|回复: 15

[已解决]'' 空字符串的处理

[复制链接]
发表于 2017-7-27 10:46:30 | 显示全部楼层 |阅读模式

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

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

x
如果
  1. name = ''
  2. print(name)
复制代码

结果是什么都看不到

现在的情况是name去到的值有些是float的,有些是空字符串的,

但是查数据库的时候,需要用字符串进行查询,

我的处理方法是str(name),

这样的话,float的可以正确执行,

空字符串的就会报错,怎么解决呢?
最佳答案
2017-7-28 11:02:41
既然抛出的是UnicodeEncodeError了,那么可以断定是编码不同导致。
先弄清楚字符串来源(数据库)中字符串的编码,这个我帮不了。然后开始改代码。
  1. code = str(int(code)) if isinstance(code, float) else str(code)
  2. #上一句的code若为与python编码不同的空字符串,便会引发异常

  3. code = str(int(code)) if isinstance(code,float) else code.decode('这里填入字符串来源的编码')
  4. #这样的话若code是字符串就会先转码了
复制代码

其他地方若是牵扯到编码不同的照着改应该也没问题。
还有,若是要把字符串写到文件里的话可能还要转码,这个也看那个文件的编码了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-7-27 10:50:16 | 显示全部楼层
没太明白你的意思,你是想print时能够看到?
加上repr函数。
  1. name = ''
  2. print(repr(name))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-27 10:56:02 | 显示全部楼层
冬雪雪冬 发表于 2017-7-27 10:50
没太明白你的意思,你是想print时能够看到?
加上repr函数。

我主要的意思是数据库中如果name字段的值是'',查询的时候如果str(name) 会通不过,如果不转换为字符串,其他的float类型的name处理不了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-27 20:15:30 | 显示全部楼层
刚刚试了一下,str('')这样的语句并不会出错,返回'',可能是楼主的python的版本不同吗?
如果还是有这样的问题,楼主可以尝试捕获str(name)通不过时抛出的异常,或者通过检查name变量的类型来差别处理。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-27 21:37:58 | 显示全部楼层
忘れえぬ物語 发表于 2017-7-27 20:15
刚刚试了一下,str('')这样的语句并不会出错,返回'',可能是楼主的python的版本不同吗?
如果还是有这样 ...

python2.7版本,如果数据库查询时,把对应的值name='',比如是'',直接查询可以,写str(name)就不可以了,给你贴出来你说的这种情况的代码吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-27 22:55:54 | 显示全部楼层
只为 发表于 2017-7-27 21:37
python2.7版本,如果数据库查询时,把对应的值name='',比如是'',直接查询可以,写str(name)就不可以了, ...

贴一下代码和运行错误信息吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-27 23:48:26 | 显示全部楼层

  1. name = ......#获得name字段的值,name的值是float或''
  2. xxx = str(name)#如楼主所说,如果name是''会发生错误(为什么呢?)
  3. #尝试解决的话有两种情况

  4. #若str(name)会抛出异常,类型为XXError
  5. try:
  6.     name = ......
  7.     xxx = str(name)
  8. except XXError:#把异常接下
  9.     xxx = name#直接重新读取也好,总之做点什么

  10. #若str(name)连异常都不抛出直接崩溃了
  11. name = ......
  12. if name == '':
  13.     pass#如楼主所说,空字符串直接读取没问题
  14. else:
  15.     xxx = str(name)
复制代码

时间不早了不能在线等了,如果解决不了就把错误信息和代码都贴上来看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-28 09:52:54 | 显示全部楼层
忘れえぬ物語 发表于 2017-7-27 23:48
时间不早了不能在线等了,如果解决不了就把错误信息和代码都贴上来看看


'' errror

'' errror


错误信息如下:
  1. Traceback (most recent call last):
  2. u'\u67cf\u4e2d\u7d27\u56fa\u4ef6(\u4e0a\u6d77)\u6709\u9650\u516c\u53f8'
  3.   File "/home/odoo/odoo-dev/custom_addons/python_learn_test/import_data/import_vendor.py", line 44, in <module>
  4.     name_cn = str(name_cn)
  5. UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-28 10:14:41 | 显示全部楼层
忘れえぬ物語 发表于 2017-7-27 23:48
时间不早了不能在线等了,如果解决不了就把错误信息和代码都贴上来看看
  1. Traceback (most recent call last):
  2.   File "/home/odoo/odoo-dev/custom_addons/python_learn_test/import_data/import_vendor.py", line 43, in <module>
  3.     code = str(int(code)) if isinstance(code, float) else str(code)
  4. UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
  5. (33, [u'', u'\u6c47\u94c6\u6377', 0.0, u'', u'\u6c47\u94c6\u6377', u'', u'', u'', u'', u'', u'', u'Standard Components', u'', u'Downpay', u'CNY', u'EXW', u'Shanghai', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u'', u''])
复制代码


还有这种错误,这些是怎么导致的,我就操作了下str()?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-28 11:02:41 | 显示全部楼层    本楼为最佳答案   
既然抛出的是UnicodeEncodeError了,那么可以断定是编码不同导致。
先弄清楚字符串来源(数据库)中字符串的编码,这个我帮不了。然后开始改代码。
  1. code = str(int(code)) if isinstance(code, float) else str(code)
  2. #上一句的code若为与python编码不同的空字符串,便会引发异常

  3. code = str(int(code)) if isinstance(code,float) else code.decode('这里填入字符串来源的编码')
  4. #这样的话若code是字符串就会先转码了
复制代码

其他地方若是牵扯到编码不同的照着改应该也没问题。
还有,若是要把字符串写到文件里的话可能还要转码,这个也看那个文件的编码了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-28 12:20:57 | 显示全部楼层
忘れえぬ物語 发表于 2017-7-28 11:02
既然抛出的是UnicodeEncodeError了,那么可以断定是编码不同导致。
先弄清楚字符串来源(数据库)中字符串 ...

操作:我是读取excel数据写入数据库的
问题:怎么知道原来的文件是什么编码的,又怎么知道我需要什么编码格式的啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-28 15:19:59 | 显示全部楼层
你gb2312,utf-8都试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-28 15:21:42 | 显示全部楼层

试验出来的?不能直接获取?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-28 16:30:57 | 显示全部楼层
本帖最后由 小Q学Python 于 2017-7-28 16:33 编辑

加一个:
  1. if name:
  2.     name = ''
  3. else:
  4.     name = str(name)
复制代码



或者
  1. name= '' if name else str(name)
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-28 16:33:02 | 显示全部楼层

不合适,上面我贴出来的代码有,str(code) 回报错,原样输出没问题的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-28 17:00:27 | 显示全部楼层
只为 发表于 2017-7-28 15:21
试验出来的?不能直接获取?

在另存为的时候应该能找到:另存为→工具→web选项→编码里看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-1 01:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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