Bagaimana cara menghapus string tertentu yang umum di banyak baris dalam file CSV menggunakan skrip python?

Saya memiliki file csv yang berisi 65.000 baris (Ukuran sekitar 28 MB). Di setiap baris, jalur tertentu di awal diberikan, mis. "c:\abc\bcd\def\123\456". Sekarang katakanlah jalur "c:\abc\bcd\" adalah umum di semua baris dan konten lainnya berbeda. Saya harus menghapus bagian umum (Dalam hal ini "c:\abc\bcd\") dari semua baris menggunakan skrip python. Misalnya isi file CSV seperti yang disebutkan.

C:/Abc/bcd/Def/Test/temp/test/GLNext/FILE0.frag                   0   0   0
C:/Abc/bcd/Def/Test/temp/test/GLNext/FILE0.vert                   0   0   0
C:/Abc/bcd/Def/Test/temp/test/GLNext/FILE0.link-link-0.frag       16  24  3
C:/Abc/bcd/Def/Test/temp/test/GLNext/FILE0.link-link-0.vert       87  116 69
C:/Abc/bcd/Def/Test/temp/test/GLNext/FILE0.link-link-0.vert.bin   75  95  61
C:/Abc/bcd/Def/Test/temp/test/GLNext/FILE0.link-link-0            0   0
C:/Abc/bcd/Def/Test/temp/test/GLNext/FILE0.link-link-6            0   0   0 

Pada contoh di atas saya memerlukan output seperti di bawah ini

FILE0.frag                  0   0   0
FILE0.vert                  0   0   0
FILE0.link-link-0.frag      17  25  2
FILE0.link-link-0.vert      85  111 68
FILE0.link-link-0.vert.bin  77  97  60
FILE0.link-link-0               0   0
FILE0.link                  0   0   0

Adakah di antara Anda yang bisa membantu saya dalam hal ini?


person Anurag Tiwary    schedule 06.07.2015    source sumber
comment
apa yang kamu coba sejauh ini?   -  person ozgur    schedule 06.07.2015
comment
Bagaimana dengan menghapus semua karakter hingga garis miring terbalik terakhir?   -  person Avinash Raj    schedule 06.07.2015
comment
tidak jelas dari pertanyaan apakah bagian umum akan dideteksi secara otomatis?   -  person Henrik    schedule 06.07.2015
comment
Hai Avinash. Terima kasih atas tanggapannya. Saya baru mengenal python dan mencoba memahami cara kerja python dalam penanganan file. Karena operasi ini harus dilakukan pada banyak file dalam satu direktori dan subdirektori, saya menggunakan os.walk untuk ini.   -  person Anurag Tiwary    schedule 06.07.2015
comment
Henrik, Bagaimana kalau kita menyimpan bagian persekutuannya di suatu variabel, karena akan selalu sama?   -  person Anurag Tiwary    schedule 06.07.2015
comment
Jika salah satu jawaban membantu Anda, sebaiknya tandai jawaban tersebut sebagai diterima sehingga dapat membantu orang lain yang memiliki pertanyaan serupa dengan Anda.   -  person Alok Mysore    schedule 06.07.2015
comment
Hai Alok, saya masih mengerjakannya dan mencoba jawaban yang berbeda. Akan menandai jawaban sebagai diterima setelah saya selesai. Terima kasih banyak atas bantuan Anda.   -  person Anurag Tiwary    schedule 06.07.2015


Jawaban (6)


^\S+/

Anda cukup menggunakan regex ini pada setiap baris dan menggantinya dengan empty string.Lihat demo.

https://regex101.com/r/cK4iV0/17

import re
p = re.compile(ur'^\S+/', re.MULTILINE)
test_str = u"C:/Abc/Def/Test/temp/test/GLNext/FILE0.frag                   0   0   0\nC:/Abc/Def/Test/temp/test/GLNext/FILE0.vert                   0   0   0\nC:/Abc/Def/Test/temp/test/GLNext/FILE0.link-link-0.frag       16  24  3\nC:/Abc/Def/Test/temp/test/GLNext/FILE0.link-link-0.vert       87  116 69\nC:/Abc/Def/Test/temp/test/GLNext/FILE0.link-link-0.vert.bin   75  95  61\nC:/Abc/Def/Test/temp/test/GLNext/FILE0.link-link-0            0   0\nC:/Abc/Def/Test/temp/test/GLNext/FILE0.link-link-6            0   0   0 "
subst = u" "

result = re.sub(p, subst, test_str)
person vks    schedule 06.07.2015

Bagaimana dengan sesuatu seperti,

import csv

with open("file.csv", 'rb') as f:
    sl = []
    csvread = csv.reader(f, delimiter=' ')
    for line in csvread:
        sl.append(line.replace("C:/Abc/Def/Test/temp\.\test\GLNext\", ""))

Untuk menulis daftar sl ke filenew digunakan,

with open('filenew.csv', 'wb') as f:
    csvwrite = csv.writer(f, delimiter=' ')
    for line in sl:
        csvwrite.writerow(line)
person Ed Smith    schedule 06.07.2015
comment
Terima kasih atas tanggapannya Ed. Apakah ini akan menyimpan file juga? - person Anurag Tiwary; 06.07.2015
comment
Anda akan memiliki daftar string baru di sl. perlu memanggil seorang penulis. Jika file Anda csv (dengan pemisah, tidak seperti data yang Anda miliki di atas) maka sebaiknya gunakan csv.reader dan csv.writer. - person Ed Smith; 06.07.2015

Anda dapat secara otomatis mendeteksi awalan umum tanpa perlu melakukan hardcode. Anda tidak terlalu membutuhkan regex untuk ini. os.path.commonprefix dapat digunakan sebagai gantinya:

import csv
import os

with open('data.csv', 'rb') as csvfile:
    reader = csv.reader(csvfile)
    paths = [] #stores all paths
    rows = [] #stores all lines
    for row in reader:
        paths.append(row[0].split("/")) #split path by "/"
        rows.append(row)

    commonprefix = os.path.commonprefix(paths) #finds prefix common to all paths

    for row in rows:
        row[0] = row[0].replace('/'.join(commonprefix)+'/', "") #remove prefix

rows sekarang memiliki daftar daftar yang dapat Anda tulis ke file

with open('data2.csv', 'wb') as csvfile:
    writer = csv.writer(csvfile)
    for row in rows:
        writer.writerow(row)
person Alok Mysore    schedule 06.07.2015

Skrip Python berikut akan membaca file Anda (dengan asumsi itu terlihat seperti contoh Anda) dan akan membuat versi yang menghapus folder umum:

import os.path, csv

finput = open("d:\\input.csv","r")
csv_input = csv.reader(finput, delimiter=" ", skipinitialspace=True)
csv_output = csv.writer(open("d:\\output.csv", "wb"), delimiter=" ")

# Create a set of unique folder names

set_folders = set()

for input_row in csv_input:
    set_folders.add(os.path.split(input_row[0])[0])

# Determine the common prefix

base_folder = os.path.split(os.path.commonprefix(set_folders))[0]
nprefix = len(base_folder) + 1

# Go back to the start of the input CSV 

finput.seek(0)

for input_row in csv_input:
    csv_output.writerow([input_row[0][nprefix:]] + input_row[1:])

Menggunakan yang berikut ini sebagai masukan:

C:/Abc/Def/Test/temp/test/GLNext/FILE0.frag                   0   0   0
C:/Abc/Def/Test/temp/test/GLNext/FILE0.vert                   0   0   0
C:/Abc/Def/Test/temp/test/GLNext/FILE0.link-link-0.frag       16  24  3
C:/Abc/Def/Test/temp/test/GLNext2/FILE0.link-link-0.vert       87  116 69
C:/Abc/Def/Test/temp/test/GLNext5/FILE0.link-link-0.vert.bin   75  95  61
C:/Abc/Def/Test/temp/test/GLNext7/FILE0.link-link-0            0   0
C:/Abc/Def/Test/temp/test/GLNext/FILE0.link-link-6            0   0   0

Outputnya adalah sebagai berikut:

GLNext/FILE0.frag 0 0 0
GLNext/FILE0.vert 0 0 0
GLNext/FILE0.link-link-0.frag 16 24 3
GLNext2/FILE0.link-link-0.vert 87 116 69
GLNext5/FILE0.link-link-0.vert.bin 75 95 61
GLNext7/FILE0.link-link-0 0 0
GLNext/FILE0.link-link-6 0 0 0

Dengan satu spasi di antara setiap kolom, meskipun hal ini dapat dengan mudah diubah.

person Martin Evans    schedule 06.07.2015

Jadi saya mencoba sesuatu seperti ini

for dirName, subdirList, fileList in os.walk(Directory):
    for fname in fileList:
        if fname.endswith('.csv'):
            for line in fileinput.input(os.path.join(dirName, fname), inplace = 1):
                location = line.find(r'GLNext')
                if location > 0:
                    location += len('GLNext')
                    print line.replace(line[:location], ".")
                else:
                    print line
person Anurag Tiwary    schedule 08.07.2015

Anda dapat menggunakan perpustakaan pandas untuk ini. Dengan melakukan hal ini, Anda dapat memanfaatkan pandas' penanganan file CSV besar yang luar biasa (bahkan dalam ukuran ratusan MB).

Kode:

import pandas as pd

csv_file = 'test_csv.csv'
df = pd.read_csv(csv_file, header=None)
print df
print "-------------------------------------------"

path = "C:/Abc/bcd/Def/Test/temp/test/GLNext/"
df[0] = df[0].replace({path:""}, regex=True)

print df
# df.to_csv("truncated.csv") # Export to new file.

Hasil:

                                                   0   1    2   3
0    C:/Abc/bcd/Def/Test/temp/test/GLNext/FILE0.frag   0    0   0
1    C:/Abc/bcd/Def/Test/temp/test/GLNext/FILE0.vert   0    0   0
2  C:/Abc/bcd/Def/Test/temp/test/GLNext/FILE0.lin...  16   24   3
3  C:/Abc/bcd/Def/Test/temp/test/GLNext/FILE0.lin...  87  116  69
4  C:/Abc/bcd/Def/Test/temp/test/GLNext/FILE0.lin...  75   95  61
5  C:/Abc/bcd/Def/Test/temp/test/GLNext/FILE0.lin...   0    0 NaN
6  C:/Abc/bcd/Def/Test/temp/test/GLNext/FILE0.lin...   0    0   0
-------------------------------------------
                            0   1    2   3
0                  FILE0.frag   0    0   0
1                  FILE0.vert   0    0   0
2      FILE0.link-link-0.frag  16   24   3
3      FILE0.link-link-0.vert  87  116  69
4  FILE0.link-link-0.vert.bin  75   95  61
5           FILE0.link-link-0   0    0 NaN
6           FILE0.link-link-6   0    0   0
person NullDev    schedule 08.07.2015