Saya memiliki sekitar 70000 file teks dalam folder yang berisi tabel yang terdiri dari 5 kolom mis:

7   0.1   0.2     0.007    0.000077
7   0.6   0.8888  0.9      0.07
3   0.8   0.09999 0.87     0.6544444
1   0.0009 0.09   0.999    0.777777
6   0.2    0.333  0.222    0.33333

Saya ingin mengganti angka "7" di kolom pertama dengan "5". Untuk melakukan ini, saya menulis kode berikut untuk membaca file teks di folder dan mengubah 7 menjadi 5 di seluruh file teks.

Pertanyaan saya adalah bagaimana cara menerapkan ini hanya pada kolom satu alih-alih seluruh file teks?

import glob
for filepath in glob.iglob('path to folder/*.txt', recursive=True):
    with open(filepath) as file:
        s = file.read()
    s = s.replace('7', '5')
    with open(filepath, "w") as file:
        file.write(s)
    
1
programmer 4 Januari 2021, 11:33

3 jawaban

Jawaban Terbaik

Modul fileinput memiliki kata kunci inplace yang praktis argumen.

from fileinput import input as fileinput
import glob

with fileinput(files=glob.iglob('path to folder/*.txt', recursive=True), inplace=True) as f:
    for line in f:
        fields = line.split('\t')
        if fields[0] == '7':
            line = '\t'.join(['5'] + fields[1:])
        print(line, end='')

Mungkin coba tanpa inplace=True sampai Anda meyakinkan diri sendiri bahwa ini bekerja dengan benar.

Saya hanya berasumsi kolom Anda dibatasi tab; seharusnya tidak terlalu sulit untuk mengadaptasi ini ke spasi-delimited atau hanya menggunakan pembatas yang berbeda seperti koma dll. (Jika input Anda adalah CSV yang tepat, mungkin gunakan modul csv Python sebagai gantinya.)

Saya juga berasumsi bahwa Anda hanya ingin mengubah 7 menjadi 5 dan tidak juga mis. 777 hingga 555. Jika Anda menginginkan itu, mungkin hanya

    # ...
    fields[0] = fields[0].replace('7', '5')
    line = '\t'.join(fields)
    # ...

Jika kolom Anda dipisahkan oleh spasi putih yang tidak dapat diprediksi tetapi panjang bidang tidak berubah saat Anda mengganti (seperti di sini, di mana Anda mengganti satu karakter dengan satu karakter), Anda dapat menggunakan

    fields = line.split()
    fields[0] = fields[0].replace('7', '5')
    line = fields[0] + line[len(fields[0]):]
2
tripleee 4 Januari 2021, 09:22

Coba gunakan pemahaman dan irisan list dan str.replace:

import glob
for filepath in glob.iglob('path to folder/*.txt', recursive=True):
    with open(filepath) as file:
        s = '\n'.join(['\t'.join([v.replace('7', '5') if i == 0 else v for i, v in enumerate(i.split('\t'))]).rstrip() for i in file])
    with open(filepath, "w") as file:
        file.write(s)
1
U11-Forward 4 Januari 2021, 09:21

Saya berasumsi file Anda menggunakan semacam pembatas, seperti koma atau tab. Dalam hal ini Anda dapat membaca file menggunakan modul CSV dan menggunakan pembatas yang sesuai dalam argumen untuk pemanggilan fungsi csv.reader.

Setelah Anda melakukannya, Anda bisa mendapatkan nilai dengan cara kolom-bijaksana dan berkeliling untuk memperbarui hanya satu kolom pada satu waktu.

Cuplikan kode contoh untuk membaca file yang dipisahkan tab adalah sebagai berikut:

with open(path, "r", encoding="utf-8") as file:
    rows = csv.reader(file, delimiter="\t")

Perhatikan argumen kata kunci pembatas

Variabel baris menyimpan nilai untuk setiap baris dan Anda dapat memilih kolom untuk baris menggunakan indeks daftar karena variabel baris adalah daftar bersarang.

0
Jayashankar Jayan 4 Januari 2021, 08:49