【问题标题】:Python and CSV; how to truncate all values in a column?Python 和 CSV;如何截断列中的所有值?
【发布时间】:2016-06-13 07:14:37
【问题描述】:

给定一个像这样的简单 CSV 文件:

Django,Gunslinger,101-707
KingSchultz,Dentist,205-707
Tatum,Marshall,615-707
Broomhilda,Wife,910-707
...,...,...

如何截断最后一列中的所有值,只保留前三位? (无关:因此它们可以用于数学运算)

所需的 CSV:

Django,Gunslinger,101
KingSchultz,Dentist,205
Tatum,Marshall,615
Broomhilda,Wife,910
...,...,...

这是我迄今为止尝试过的:

import csv
import re
r = csv.reader(open(input.csv))
for row in r:
    re.sub('\-.*', '', row[3])
writer = csv.writer(open('output.csv', 'w'))
writer.writerow(row)

我已验证 re.sub 中的 regex 工作正常。尝试了数十种变体,搜索了很多小时,但无法获得所需的输出。

【问题讨论】:

    标签: python regex csv


    【解决方案1】:

    不使用re模块,

    import csv
    
    r = csv.reader(open("sample.csv", "rb"))
    writer = csv.writer(open("output.csv", "wb"))
    
    for row in r:
        row[2] = row[2][:3]
        writer.writerow(row)
    

    正如@TigerRedMike 在Python 3.X 中指出的那样,应该分别使用'rb' 和'wb',而不是'r' 和'w' 来读取和写入文件。

    【讨论】:

    • 在 Python 2.7.6 和 3.4.3 上测试过。谢谢@praba230890。我编辑了答案以包含一个简单的错误,该错误可能会使 Python 3.4.3 上的其他人感到困惑。
    • 你能解释一下[:3]的语法吗?
    • 这是字符串切片,[:3] 将字符串的前3个字符切片并返回。看看这个docs.python.org/3/tutorial/introduction.html#strings
    【解决方案2】:
    import csv
    import re
    
    r = csv.reader(open('input.csv'))
    writer = csv.writer(open('/tmp/output.csv', 'w'))
    
    for row in r:
        tmp = re.sub('\-.*', '', row)
        writer.writerow(tmp)
    

    【讨论】:

      【解决方案3】:

      第一件事是re.sub 返回一个新值,它不会替换行中的值。

      其次,row 是一个运行变量,你应该在循环中处理它。

      这里你的代码修改为正常工作(对于python3):

      import csv
      import re
      r = csv.reader(open('.../test.csv'))
      with open('.../test2.csv', 'w') as csvfile:
          writer = csv.writer(csvfile, delimiter=',')
          for row in r:
              row[2] = re.sub('\-.*', '', row[2])
              writer.writerow(row)
      

      【讨论】:

      • 在 Python 2.7.6 和 3.4.3 上测试过。谢谢@DomTomCat。由于此答案使用正则表达式,因此它将适用于复杂的编辑。
      • [过早优化是万恶之源——DonaldKnuth] (c2.com/cgi/wiki?PrematureOptimization)
      【解决方案4】:

      re.sub 返回带有替换的字符串。它不会影响第三个参数本身

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-18
        • 2011-08-27
        • 2011-07-30
        • 2010-12-14
        • 2019-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多