Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用csv.reader删除尾随字符和前导字符_Python_Csv - Fatal编程技术网

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

Python 使用csv.reader删除尾随字符和前导字符,python,csv,Python,Csv,如果我在csv的第二列中的值以开头或结尾,如何删除某个字符,我对python非常陌生,请帮助我解决这个问题 例如: 到 我有这个代码使用数据填充 TRIM(TRAILING ')' FROM TRIM(LEADING '(' 如何在我的代码中应用它: 这里有一种方法,我已经替换了字符串和的第一个和最后一个匹配项。希望能有帮助 s = '''0023632fa4a860be8bc85ddf39fc19c3c4c2e6fe,(Java Archive (JAR) 4049-0),Not Suppo

如果我在csv的第二列中的值以开头或结尾,如何删除某个字符,我对python非常陌生,请帮助我解决这个问题

例如:

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

TRIM(TRAILING ')' FROM TRIM(LEADING '('
如何在我的代码中应用它:


这里有一种方法,我已经替换了字符串和的第一个和最后一个匹配项。希望能有帮助

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:我从

中偷了最后一个替换函数这是一个学习的好机会!正则表达式是一种识别和处理文本模式的方法。Python有一个正则表达式包作为其标准库的一部分。我将假设您在本答案的其余部分使用Python3,其中包名为re

TLDR对您的问题的回答是:

import re

string_without_parens = re.sub(r'(^\()|(\)$)', '', string_maybe_has_parens)
但是这里发生了什么?sub函数接受三个参数,一个由前导r表示的正则表达式字符串,一个要替换每个匹配项的字符串,以及一个要替换的字符串。这里的正则表达式是^\\$。那是什么意思?让我们一步一步来:

一组圆括号表示一个捕获组,这些圆括号可用于获取匹配项,但我使用它们将我们要查找的字符分组。此正则表达式中有两个捕获组:^\和\$。 在这两个字符之间是一个|字符,它表示或在正则表达式语言中,因此它要查找与^ \或\$匹配的内容。 第一个捕获组^\:里面有两个东西,实际上是三个,但我们会说到这一点。第一个是^,这就是所谓的锚,这个特别说,只看字符串的开头。第二个和第三个字符是\表示我要查找左括号。因为在正则表达式中使用括号,所以必须使用反斜杠字符对其进行转义。 第二个捕获组\$:包含一个转义的右括号\和其他锚点。此锚点表示字符串的结尾,与^1表示开始的方式相同。 这表明:在开始处匹配一个左括号或在结束处匹配一个右括号,re.sub函数表示将匹配此模式的任何内容替换为nothing。 希望有帮助!如果您想更多地使用正则表达式,可以尝试一下,这有助于我了解正则表达式。

使用lstrip和rstrip的解决方案

编辑

要在新的.csv文件上保存编辑,只需添加:

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

给出一个该行如何转换的示例。更新了我的问题为什么JAR仍然存在?因为我只需要删除字符串开头和结尾的行。那么line.lstrip.rstrip呢?是的,这也行,使用这种方法可以很容易地替换多行,以后。如果你只想替换,而有些人在遇到问题时会想‘我知道,我会使用正则表达式’,这将是低效的。现在他们有两个问题。-杰米Zawinski@VineethSai正则表达式可以编译成在On中运行的DFA,我怀疑使用锚点可以将其优化为引擎盖下的O1。使用replace方法可以使您的解决方案继续运行。regex的笼统声明很慢,对任何人都没有帮助。如果你想了解更多关于正则表达式速度的信息,我建议你阅读一下。Regex还提供了简洁、易于理解的语法,在这种情况下,只需一行即可。如何将其换行?我创建了新行。appendrow[0]+','+row[1].lstrip.rstrip+','+row[2]+\n因此数组类似于csv,但它不工作。我需要使用\n将其打断,以便在打印时显示每行以获取每行只需使用:对于新行中的行:PrintLine是否仍有保存到更新的csv?因为我试图将我的csv导入数据库,所以我包含了将新的行写入test2.csv文件的代码。如果这对你有帮助,请考虑投票和接受答案。谢谢
['0023632fa4a860be8bc85ddf39fc19c3c4c2e6fe,Java Archive (JAR) 4049-0,Not Supported,',
'005c41fc0f8580f51644493fcbaa0d2d468312c3,WIN32 EXE 7-2,Ransom.Win32.TRX.XXPE50FFF027,']
import re

string_without_parens = re.sub(r'(^\()|(\)$)', '', string_maybe_has_parens)
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']
with open('test2.csv', 'wt') as file:
    writer = csv.writer(file)
    for row in new_rows:
        writer.writerow(row)