使用删除尾随字符和前导字符csv.read文件

2024-09-28 01:30:12 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我在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,

我有这个代码使用数据填充

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

如何在我的代码中应用它:

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

Tags: csv代码notjavaexejarfilesupported
3条回答

这里有一种方法,我替换了字符串中第一次出现的和最后一次出现的“(”和“)”。希望有帮助。你知道吗

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:我从here偷了last_replace函数

使用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)

这是一个学习regular expressions的好机会!正则表达式是一种识别和处理文本模式的方法。Python有一个正则表达式包作为其标准库的一部分。我将假设您在这个答案的其余部分使用python3,其中包名为re。你知道吗

TLDR对您的问题的回答是:

import re

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

不过,这是怎么回事?re.sub()函数有三个参数,一个正则表达式字符串(由前导的r表示),一个要替换每个匹配项的字符串,以及要在中替换的字符串。这里的正则表达式是(^\()|(\)$)。那是什么意思?让我们一步一步来:

  • 一组圆括号()表示一个捕获组,这些圆括号可以用来获取匹配项,但我使用它们作为一种将我们要查找的字符分组的方法。这个正则表达式中有两个捕获组:(^\()(\)$)。你知道吗
  • 这两个字符之间有一个|字符,它表示或在正则表达式语言中,所以它在寻找匹配(^\()(\)$)的字符。你知道吗
  • 第一个捕获组(^\():里面有两个东西(好吧,确实有三个,但我们会讲到这一点)。第一个是^,这就是所谓的锚点,这一个特别说,“只看字符串的开头”。第二个(和第三个)字符是\(,表示“我想找一个左括号”。因为括号在正则表达式中使用,所以我们必须使用反斜杠字符来“转义”它。你知道吗
  • 第二个捕获组(\)$):包含转义的右括号\)和其他锚点。这个锚点表示字符串的结尾,就像^表示开始一样。你知道吗
  • 这个函数表示:“在开头匹配一个左括号,在结尾匹配一个右括号,re.sub()函数表示用'''(即nothing)替换与此模式匹配的任何内容。你知道吗

希望有帮助!如果您想更多地使用正则表达式,可以尝试regexr,这有助于我了解它们。你知道吗

相关问题 更多 >

    热门问题