python处理一个文本文件
PHP中文网
PHP中文网 2017-04-17 17:42:39
0
1
388

这个文本文件核心有几种情况:
1.序号 ID 操作者 操作行为 操作行为 操作对象
6883 556773833 RemyMCMXI
6880 556772838 Mindmatrix restored undeleted RemyMCMXI
6882 556771715 RemyMCMXI
6881 556770863 RemyMCMXI
6880 556673938 Liua97
6879 554350969 Epicgenius
6880 554332653 Alex

找到restored所在行,得到该行序号6880,然后往下读,找到第一个与其序号相同的行(liua97那行),然后记录下这两行之间所有的id值(包括restored那行),这个例子就是记录下556772838 556771715 556770863这三个id。

2.序号 ID 操作者 操作行为 操作行为 操作对象
208 1675137 Netizen restored undeleted Netizen
207 1648639 Netizen
206 1648621 142.58.181.84
205 1646546 Patrick
204 1638165 Patrick

找到restored所在行,然而往下找不到这个restored行的序号208,这个时候就是读取undelted对象,然后往下找相邻的这个对象的操作者(一般情况下这个restored往下的相邻行的操作者这个对象)。比如这个例子就是记录1675137 1648639这两个id。

3.序号 ID 操作者 操作行为 操作行为 操作对象
153 1254853 Eloquence restored undeleted Eloquence
152 1254819 Eloquence
151 1254815 Eloquence
150 1254812 Eloquence
149 1254799 Eloquence
148 1254796 Eloquence
147 1254782 Eloquence
146 1254771 Eloquence
145 1254740 217.185.183.250

这个同样也是,restored所在行的序号153往下找找不到,然后undeleted的对象在下面连续出现,这个时候就是记录连续出现的所有行的id,就是1254853 819 815 812 799 796 783 771这几个id。

然后现在我对这样的处理没有什么思路,,文本文件的一行就是一个字符串 split的话那些没有包含restored的行就会出现数组越界。。。我就不知道该怎么处理了,求各位大神给个思路orz

PHP中文网
PHP中文网

认证高级PHP讲师

membalas semua(1)
迷茫

Untuk situasi pertama, anda boleh rujuk kaedah berikut:

Jika anda menggunakan Python3 atau ke atas:

with open('G:\reserve9.txt', 'r') as reader:
    flag = False
    flag_number = None

    for line in reader:
        number, ID, *items =  line.split()

        if not flag and 'restored' in items:
            flag = True
            flag_number = number
        elif flag and number==flag_number:
            flag = False
            flag_number = None
        
        if flag:
            print(ID)
            

Biar saya terangkan sedikit kod Objek fail yang dijana dengan menggunakan open boleh digunakan secara langsung sebagai lelaran Menggunakan for line in reader: lebih ringkas daripada menggunakan baris baca.

Selain itu, number, ID, *items = line.split() digunakan untuk membongkar Ia akan memperuntukkan rentetan yang dipotong oleh line.split() kepada nombor (kepada rentetan potong pertama) dan ID (kepada yang kedua), dan akhirnya ia akan memperuntukkan yang lain Potong. rentetan ke dalam senarai dan berikannya kepada items (pembolehubah yang ditandakan dengan asterisk).

Walau bagaimanapun, penggunaan ini mungkin tidak boleh digunakan untuk semua versi Python, jadi jika anda menggunakan Python2.7, anda boleh menggunakan kaedah berikut:

with open('reserve9.txt') as reader:
    flag = False
    flag_number = None

    for line in reader:
        items =  line.split()
        number = items[0]
        ID = items[1]

        if not flag and 'restored' in items:
            flag = True
            flag_number = number
        elif flag and number==flag_number:
            flag = False
            flag_number = None
        
        if flag:
            print ID
            

Idea pendekatan ini sangat mudah Tetapkan bendera flag untuk menentukan sama ada ID baris perlu dicetak atau dikumpulkan. Kedua, setiap baris mesti menggunakan number dan flag_number untuk menentukan sama ada hendak menghidupkan atau mematikan flag.


Berikut ialah kod untuk Python3 Jika perlu, anda boleh menukar print kepada penggunaan Python2. Perbezaannya hanya di sini. (Maaf kerana saya menulisnya dengan cepat, kod itu mungkin tidak cukup diperhalusi)

Memandangkan semua senario, dua kelas ditakrifkan dahulu: IdCollect untuk mengumpul ID dan Action untuk membantah operasi:

*IdCollect kelas

class IdCollect:

    def __init__(self):
        self.dic = {}
        self.outputs = []
        self.idx = 0
        self.newest_action = None

    def do_new_a_collect(self, action):
        if not self.dic.get(action.number, {}):
            if 'restored' in action.ops:
                return True
        return False

    def do_finish_a_collect(self, action):
        collect = self.dic.get(action.number, {})
        if collect:
            return True
        return False

    def handle(self, action):
        print('handle...', action)
        if self.do_new_a_collect(action):
            print('--- do collect new...')
            self.collect_new(action)
        elif self.do_finish_a_collect(action):
            print('--- do collect finish...')
            self.collect_finish(action)
        else:
            print('--- do collect...')
            self.collect(action)

    def collect(self, action):
        if self.newest_action:
            current_collect = self.dic[self.newest_action.number]
        else:
            print('do nothing')
            return

        # collect undeleted
        if not current_collect['undeleted_finish']:
            if action.user1==current_collect['undeleted_user']:
                print('------ collect undeleted')
                current_collect['undeleted_buffer'].append(action)
            else:
                print(action.user1, current_collect['undeleted_user'])
                print('------ finish undeleted')
                current_collect['undeleted_finish'] = True

        # collect restored
        print('------ collect restored')
        current_collect['restored_buffer'].append(action)

    def collect_new(self, action):
        undeleted_buffer = []
        undeleted_user = None
        restored_buffer = []

        if 'undeleted' in action.ops:
            undeleted_buffer.append(action)
            undeleted_user = action.user2
        restored_buffer.append(action)

        self.dic[action.number] = {
            'undeleted_buffer': undeleted_buffer,
            'undeleted_user': undeleted_user,
            'undeleted_finish': False,
            'restored_buffer': restored_buffer,
            'restored_finish': False,
            'idx': self.idx
        }
        self.idx += 1
        self.newest_action = action

    def collect_finish(self, action):
        collect = self.dic[action.number]
        collect['restored_finish'] = True
        self.outputs.append(collect)
        self.dic[action.number] = {}
        self.newest_action = None

    def output(self):
        for number, collect in self.dic.items():
            if collect:
                self.outputs.append(collect)

        self.outputs.sort(key=lambda collect: collect['idx'])

        for collect in self.outputs:
            if collect['restored_finish']:
                for action in collect['restored_buffer']:
                    print('r', action.ID)
            else:
                if collect['undeleted_buffer']:
                    for action in collect['undeleted_buffer']:
                        print('d', action.ID)

*Action Kelas:

class Action:

    def __init__(self, action_str):
        action_str = action_str.strip()
        items = action_str.split()
        self.number = items[0]
        self.ID = items[1]
        self.user1 = items[2]
        self.ops = items[3:]

        if len(self.ops) > 1:
            self.ops = self.ops[:-1]
            self.user2 = items[-1]
        else:
            self.user2 = ''

    def __str__(self):
        return ' '.join([str(item) for item in [self.number, self.ID, self.user1, self.ops, self.user2]])

Yang terakhir ialah kaedah yang digunakan:

with open('reserve9.txt') as reader:

    id_collect = IdCollect()

    for line in reader:
        action = Action(line)

        id_collect.handle(action)

    print('-- output --')
    id_collect.output()
    

Berikut ialah fail ujian yang saya coretkan:

6883 556773833 RemyMCMX
6880 556772838 Mindmatrix restored undeleted RemyMCMXI
6882 556771715 RemyMCMXI
6881 556770863 RemyMCMXI
6880 556673938 Liua97
6879 554350969 Epicgenius
6880 554332653 Alex
13 82239 194.205.123.10 restored undeleted 62.30.0.4
14 64090 62.30.0.4
13 64041 Lee Daniel Crocker
12 61789 JeLuF
11 55828 Conversion script
10 294279 62.82.226.xxx
9 294278 Larry_Sanger
8 294277 Larry_Sanger
7 334555726 24.112.58.xxx
5 334555725 156.62.18.xxx restored undeleted 156.62.18.xxx
6 334555724 156.62.18.xxx
5 334555723 AxelBoldt
4 334555722 The Cunctator
3 334555721 The Cunctator
1 334555720 Alan D
2 334555718 64.38.175.xxx
1 334555717 The Cunctator
5 334555725 156.62.18.xxx restored undeleted 156.62.18.xxx
6 334555724 156.62.18.xxx
6 334555724 156.62.18.xxx
6 334555724 156.62.18.xxx
6 334555724 156.62.18.xxx
6 334555724 156.62.18.xxx
1 334555720 Alan D
1 334555720 Alan D
1 334555720 Alan D
1 334555720 Alan D
1 334555720 Alan D
1 334555720 Alan D
1 334555720 Alan D
13 82239 194.205.123.10 restored undeleted 62.30.0.4
13 64041 Lee Daniel Crocker

Keluaran kelihatan seperti ini:

...一些省略掉的收集過程...
-- output --
r 556772838
r 556771715
r 556770863
r 82239
r 64090
r 334555725
r 334555724
d 334555725
d 334555724
d 334555724
d 334555724
d 334555724
d 334555724
r 82239
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan