【问题标题】:Seaching .csv for unwanted string and delete搜索 .csv 以查找不需要的字符串并删除
【发布时间】:2015-09-16 09:22:50
【问题描述】:

我正在对 short.csv 进行测试: 这就是我的“原始”.csv 的样子:

> print test.csv
> onü, toé, 112 #first line in .csv
> four, FIVE, seven #second line in .csv

我想把它读出来并做一些字符串格式化。

# -*- coding: utf-8 -*-
allowed = re.compile("[^0-9a-zA-Z\s,.:]")
myJoin = ""
with open("test.csv") as f:
    for i in f:
        splitted = i.split(",")
        myString = ",".join(splitted)
        myList = list(myString)
        for j in allowed.finditer(myString):
            x = int(j.start())
            del myList[x]

当我打印出x 时,我得到了这个输出:

> x 
> 2
> 3
> 8
> 9

我以为我在allowed 中使用了空格和逗号?! 我无法理解为什么它将这些标记为“不应该在那里”。此外,我无法直接将其写回.csv,看起来像这样。

我的新“干净”.csv:

> print test.csv
> on, to, 112 #first line in .csv
> four, FIVE, seven #second line in .csv

【问题讨论】:

  • 使用re.sub( r'[^0-9a-zA-Z\s,.:]', '', i )
  • @hjpotter92 在哪里、如何以及为什么?
  • 当您使用[^ 创建模式时,您将否定集合内的字符。
  • @hjpotter92 当然可以。防御性编程。我希望删除该组字符/符号中 NOT 的所有内容!
  • 确认一下,你想扔掉文件名并保留扩展名?

标签: python regex csv


【解决方案1】:

您可以使用 Python 的 csv 模块来帮助解决这个问题。以下应该会给你想要的结果:

import csv
import re

with open('input.csv', 'r') as f_input, open('output.csv', 'wb') as f_output:
    csv_input = csv.reader(f_input, skipinitialspace=True)
    csv_output = csv.writer(f_output)
    keep = re.compile(r'[^0-9a-zA-Z\s,.:]')

    for cols in csv_input:
        cols = [keep.sub('', col) for col in cols]
        csv_output.writerow(cols)

给你一个output.csv如下:

on,to,112
four,FIVE,seven

【讨论】:

  • 感谢您帮助我。
【解决方案2】:

与 Martin Evans 的回答没有什么不同,只是它对每个项目都使用了替换:

# -*- coding:utf-8 -*-
import re
import csv

with open('test.csv', 'rb') as source, open('result.csv', 'wb') as destination:
    allowed = re.compile(r'[^0-9a-z,.:\s]+', re.I)
    csv.register_dialect('mydial', delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL, skipinitialspace=True)
    testreader = csv.reader(source, 'mydial')
    reswriter = csv.writer(destination, 'mydial')
    for row in testreader:
        reswriter.writerow([allowed.sub('', x) for x in row])

请注意,前导空格会在结果中消失,但这不是一件坏事。

【讨论】:

  • 我接受 Martin Evans 的回答,因为我更了解它。谢谢!
猜你喜欢
  • 2021-02-15
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 2011-12-24
相关资源
最近更新 更多