跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Python 操作 csv,这种情况这么打断点判断错在哪里?
未分類
22 4 月 2020

Python 操作 csv,这种情况这么打断点判断错在哪里?

Python 操作 csv,这种情况这么打断点判断错在哪里?

資深大佬 : ShuoHui 20

需求:

  • 从某个 csv 表格提取需要的数据,写入 xlsx
  • 如果第 11 列的单元格包含“xxx”字段,则删除该行

开始的时候,我是这样:

dir = (r'C:\Users\ShuoHui\Desktop\data\') workbook = open(dir + 'filename.csv') workbookReader = csv.reader(workbook) workbookData = list(workbookReader)  nRows = workbookReader.line_num rowsNum = 1  # 行号 for rowsNum in range(1, nRows):     if workbookData[rowsNum][10] != 'xxx':         outsheet.write(rowsNum, 0, workbookData[rowsNum][4])         outsheet.write(rowsNum, 1, workbookData[rowsNum][10])         outsheet.write(rowsNum, 4, workbookData[rowsNum][9])         outsheet.write(rowsNum, 5, workbookData[rowsNum][2])         outsheet.write(rowsNum, 9, workbookData[rowsNum][0])     else:         continue outworkbook.save(dir + "out\filename.xlsx") 

上面这种情况,可以输出想要的,但是会有空白行,于是我想说,加入一个 i 控制写入时候的行号,就是这样:

dir = (r'C:\Users\ShuoHui\Desktop\data\') workbook = open(dir + 'filename.csv') workbookReader = csv.reader(workbook) workbookData = list(workbookReader)  nRows = workbookReader.line_num rowsNum = 1  # 行号 for rowsNum in range(1, nRows):     i = 1 #从第 2 行开始写入     if workbookData[rowsNum][10] != 'xxx':         outsheet.write(i, 0, workbookData[rowsNum][4])         outsheet.write(i, 1, workbookData[rowsNum][10])         outsheet.write(i, 4, workbookData[rowsNum][9])         outsheet.write(i, 5, workbookData[rowsNum][2])         outsheet.write(i, 9, workbookData[rowsNum][0])         i += 1     else:         continue outworkbook.save(dir + "out\filename.xlsx") 

但是这样子,只会输出最后一行有效数据。 问题 1:以后我遇到这样循环的问题,怎么打断点排错(pycharm) 问题 2:我这个问题出在哪里。。。 ps: *** 小弟基础不好 ***,请各位大神不吝赐教,感谢大家。

大佬有話說 (12)

  • 資深大佬 : jtr109

    第二段代码「只会输出一行」是因为:for 循环每次都会执行一遍代码块(缩进部分)中的命令,所以每次循环都会把 i=1 执行一遍,所以一只在同一行反复输入。

    上面一个「空白行」我没有理解是什么意思,如果需要打断点,可以注意 rowsNum 的值是否符合预期。特别是「第一行」应该是 1 还是 0 。

  • 資深大佬 : crella

    错误原因:for 循环内每次循环,i 都被设置为 1

    改进:i 放到 for 循环以前设置 i=1,如果满足什么!= ‘xxx’,则 outsheet 写入第 i 行,然后循环结束时设置 i+=1

  • 主 資深大佬 : ShuoHui

    @jtr109 我把 i=1 放在 for 外面可以了,感谢回复!

  • 主 資深大佬 : ShuoHui

    @crella 感谢

  • 資深大佬 : yzlnew

    如果经常处理这样的数据可以考虑使用 pandas

  • 資深大佬 : dobest

    推荐使用 pandas 进行处理,读入 csv,删除特定行,然后 to_excel 写到 Excel

  • 主 資深大佬 : ShuoHui

    @yzlnew
    @dobest 昨天也了解过 pandas 也在学习中,其他需求可以做,但是删除特定行不会写。也没搜到,所以就先用 csv 做了。感谢提醒。

  • 資深大佬 : SjwNo1

    第一个 outsheet 变量是啥,可以使用类似于 Worksheet.Rows(i).Delete() 的方法
    第二个 循环定义初始变量 i,不过这样能否起效果就不得而知了
    还有:重复变量声明 rowsNum = 1 是? (拙见~

  • 主 資深大佬 : ShuoHui

    @SjwNo1 outsheet 是我要输出的表格,忘记贴上来了。
    还有重复变量声明。。经你们提醒我才发现。

  • 資深大佬 : no1xsyzy

    python 的 csv 操作始终应打开自 open(…, newline=”)
    https://docs.python.org/3/library/csv.html#csv.reader

    看脚注,一来如果内容有换行无法正常操作,二来如果你的平台行尾用的是 rn,则会发生空行

    为 v2 的水平感到痛心,深深地感到惋惜

  • 資深大佬 : princelai

    df = pd.read_csv(‘filename.csv’)

    df.query(“col11name not in [‘xxx’]”).to_exxcel(“out\filename.xlsx”)

    拿去吧

  • 主 資深大佬 : ShuoHui

    @princelai 万分感谢

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具