繁体   English   中英

使用csv.reader删除尾随和前导字符

[英]Remove trailing and leading char using csv.reader

如果我在csv第二栏中的值以“(”或以“)结尾,我该如何删除某个字符,我对python专家来说是个新手,可以帮助我解决这个问题

例:

0023632fa4a860be8bc85ddf39fc19c3c4c2e6fe,(Java Archive (JAR) 4049-0),Not Supported,
005c41fc0f8580f51644493fcbaa0d2d468312c3,(WIN32 EXE 7-2),Ransom.Win32.TRX.XXPE50FFF027,

0023632fa4a860be8bc85ddf39fc19c3c4c2e6fe,Java Archive (JAR) 4049-0,Not Supported,
005c41fc0f8580f51644493fcbaa0d2d468312c3,WIN32 EXE 7-2,Ransom.Win32.TRX.XXPE50FFF027,

我有使用DATA INFILE的代码

TRIM(TRAILING ')' FROM TRIM(LEADING '('

如何在我的代码中将其应用于此处:

with open(fullPath, 'rb') as file:
     csv_data = csv.reader(file)
     next(csv_data)

使用lstrip()rstrip()解决方案

import csv

new_rows = []
with open('test.csv', 'rt') as file:
    csv_data = csv.reader(file, delimiter=',')
    for row in csv_data:
        new_rows.append([row[0],row[1].lstrip('(').rstrip(')'),row[2]])

print(new_rows) # Outputs ['0023632fa4a860be8bc85ddf39fc19c3c4c2e6fe,Java Archive (JAR) 4049-0Not Supported', '005c41fc0f8580f51644493fcbaa0d2d468312c3,WIN32 EXE 7-2ansom.Win32.TRX.XXPE50FFF027']

编辑

要将修改保存到新的.csv文件中,只需添加:

with open('test2.csv', 'wt') as file:
    writer = csv.writer(file)
    for row in new_rows:
        writer.writerow(row)

这是一种实现方式,我从字符串中替换了第一次出现和最后一次出现的'('和')'。 希望能帮助到你。

s = '''0023632fa4a860be8bc85ddf39fc19c3c4c2e6fe,(Java Archive (JAR) 4049-0),Not Supported,
005c41fc0f8580f51644493fcbaa0d2d468312c3,(WIN32 EXE 7-2),Ransom.Win32.TRX.XXPE50FFF027,'''

def last_replace(s, old, new, occurrence):
    '''Replaces the last occurence of the character'''
    li = s.rsplit(old, occurrence)
    return new.join(li)

new_string = [last_replace(line, ')', '', 1).replace('(', '', 1) for line in s.split('\n')]
print(new_string)

输出:

['0023632fa4a860be8bc85ddf39fc19c3c4c2e6fe,Java Archive (JAR) 4049-0,Not Supported,',
'005c41fc0f8580f51644493fcbaa0d2d468312c3,WIN32 EXE 7-2,Ransom.Win32.TRX.XXPE50FFF027,']

PS:我从这里偷走了last_replace函数

这是学习正则表达式的绝佳机会! 正则表达式是一种识别和处理文本模式的方法。 Python在其标准库中有一个正则表达式包。 我将假设您在其余答案中使用Python 3,该软件包的名称为re

TLDR对您的问题的回答是:

import re

string_without_parens = re.sub(r'(^\()|(\)$)', '', string_maybe_has_parens)

不过,这是怎么回事? re.sub()函数采用三个参数,一个正则表达式字符串(由前导r表示),一个您要替换每个匹配项的字符串以及一个您要替换的字符串。此处的正则表达式为(^\\()|(\\)$) 那是什么意思呢? 让我们逐步进行:

  • 一组括号()代表一个捕获组,它们可以用来获取匹配项,但我已经将它们用作将我们要寻找的字符进行分组的一种方式。 此正则表达式中有两个捕获组: (^\\()(\\)$)
  • 这些之间是| 字符,以正则表达式语言表示“或”,因此它正在寻找与(^\\() (\\)$)匹配的东西。
  • 第一个捕获组(^\\() :里面有两件事(嗯,确实有三件事,但我们会讲到这一点)。第一个是^ ,这就是所谓的锚点 ,尤其是这样说:“只看字符串的开头。”第二(和第三个)字符是\\(这表示“我想寻找一个开括号”。因为正则表达式中使用了括号,所以我们必须使用反斜杠字符“逃脱”。
  • 第二个捕获组(\\)$) :包含一个转义的右括号\\)和其他锚点。 该锚点代表字符串的结尾,以^代表开始点的方式相同。
  • 在一起说:“在开头匹配一个圆括号,在结尾匹配一个圆括号”,而re.sub()函数说,用”替换任何与此模式匹配的东西(即,什么也没有)。

希望有帮助! 如果您想更多地使用正则表达式,可以尝试使用regexr ,它可以帮助我将脑袋缠在它们周围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM