簡體   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