0

我正在尝试从一个非常大的 .txt 文件(300,000 多行)中解析多行文本块,并将这些文本块写入一个新文件。我需要的每个文本块是 42 行,每个 42 行块的第一行以唯一的语言名称开头。

我创建了一个文本文件,在单独的行上列出了我需要的每个唯一语言名称。我已经从该文本文件中创建了一个列表,并希望遍历该列表以找到主文件中的每个唯一语言名称,然后复制特定于该唯一名称的 42 两行并将这 42 行文本块写入一个新文件。

我是编程/Python 的新手,我能找到的类似问题不足以解决我的问题,所以请原谅我的无知。我被困在评论部分#pseudocode。

from sys import argv

script, from_file, to_file = argv

# Opens input/output files
infile = open(from_file).read()
outfile = open(to_file, 'w')


# Appends all unique language names into a list
langList = []
with open('language-list.txt') as file:
    for language in file:
        name = language.strip()
        langList.append(name)

# Pseudo code of what I want to do
for l in langList:
    find l in infile
    copy 42 lines beginning with match l
    write to outfile

以下是 language-list.txt 文件的示例:

CENTRAL_GOJAL_WAKHI
TURKMEN

主文本文件可以在这里下载:http: //email.eva.mpg.de/~wichmann/listss16.zip

上面的两种示例语言可以位于此文本文件中。尽管我对解析大约 1000 种语言感兴趣,但任何关于如何为两种语言完成此任务的建议都足以推动我朝着正确的方向前进。

先感谢您!

4

3 回答 3

1

I normally don't do that, but as I have a weakness for linguistics and linguists, here you go:

import re

swadesh = {}
lang = None

with open('/tmp/listss16.txt') as fp:
    for line in fp:
        m = re.match(r'(\d+)\s+\w+\s+([^/]+)', line)
        if m:
            if lang:
                swadesh[lang][int(m.group(1)) - 1] = m.group(2).strip()
            continue
        m = re.match(r'([A-Z]\w+){', line)
        if m:
            lang = m.group(1)
            swadesh[lang] = [''] * 100
            continue

This creates the dict lang_name : list, e.g.

LITHUANIAN : ['aS', 'yus, tu', 'mes', 'Sitas', 'anas, tas', 'kas, kuris', 'kas', 'ne', 'visas, visi', 'daugelis', 'vienas', 'du, div', 'didelis, platus', 'ilgas, letas', 'maZas, maZutis', 'moteris', 'Zmogus', 'asmuo, Zmogus', 'Zuvis', 'paukStis', 'Suo', 'utele', 'medis', 'sekla, grudas', 'lapas', 'Saknis', 'Zieve', 'oda, kailis', 'mesa, kunas', 'krauyas, giminy~ste', 'kaulas', 'taukai, riebalai', 'kiauSinis', 'ragas', 'uodega, eile', 'plunksna', 'palukas', 'galva', 'ausis', 'akis', 'nosis, nuyautimas', 'burna', 'dantis', 'lieZuvis', 'nagas', 'koya, peda', 'kelis', 'ranka', 'pilvas, skramdis', 'kaklas', 'krutine', 'Sirdis', 'kepeny~s', 'ger, girtau', 'valgy~, iSes', 'kas, gel', 'maty~, Ziure', 'girde, iSklausy~ti', 'Zino, paZin', 'miegas', 'mir', 'uZmuS, nuZudy~', 'plaukio', 'skris, pralek', 'ei, vaikSCio', 'atei, atvy~k', 'gule, bu', 'sede, posedZiau', 'stove, atsisto', 'duo, dovano', 'nuomone, Zodis', 'saule', 'menulis', 'ZvaigZde, Sviesuly~s', 'vanduo', 'lietus', 'akmuo', 'smely~s', 'Zeme', 'debesy~s', 'dumai', 'ugnis, liepsna', 'pelenai', 'deg', 'takas, kelelis', 'kalnas', 'raudonas, paraudes', 'Zalias, nesubrendes', 'geltonas', 'baltas', 'yuodas, tamsus', 'naktis', 'karStas', 'Saltas, abeyingas', 'pilnas, visas', 'nauyas, SvieZias', 'geras, malonus', 'apskritas, apvalus', 'sausas', 'vardas']
KHWARSHI : ['do', 'mo', 'ilo', '', '', '', '', '', '', '', 'hos', 'qw"X$inE', '', '', '', '', '', '%Xadam', 'CuXa', '', 'XXw$E', 'noc"o', 'Xon', '', 'tL~ib', '', '', 'qX~al', '', 'e*q"X~o', 'tL~ozol', '', '', 'SEly~u', '', '', '', '', 'a*hX~a', 'Ezol', 'ma*ni', '', 's3l', 'muc', '', '', 'gurtu', 'litL"a', '', '', 'koko', '', 'Zubu', 'c"oda', '', '', 'aka', 'tuqX~a', '', '', 'uha', '', '', '', '', 'ok"a', '', '', '', '', '', 'buqXX$', '', 'ca', 'Lo', '', 'Xur', '', '', '', '', 'c"o', '', '', 'hu*nE', 'hu*n', '', '', '', '', '', 'rELa', '', '', 'lec"u', 'uc"nu', '', '', '', 'co']
MANDARIN_2 : ['wo', 'ni', 'women', '', '', '', '', '', '', '', 'yi', 'er', '', '', '', '', '', 'ren', 'yu', '', '%gow', 'Sizi, towSi', 'Su', '', 'yezi', '', '', 'pi', '', 'Sie, Swe', 'gu tow', '', '', 'jiao', '', '', '', '', 'erduo', 'yanjiN', 'bizi', '', 'ya, yaCi', 'Setow', '', '', 'Si, Sigai', 'Sow', '', '', 'rufaN', '', 'gan, ganzaN', 'he', '', '', 'jian', 'tiN', '', '', 'si', '', '', '', '', 'lai', '', '', '', '', '', 'taiyaN', '', 'SiNSiN', 'Sui', '', 'Sitow', '', '', '', '', 'huo', '', '', 'xiaolu', 'Ciu, CiuliN', '', '', '', '', '', 'ye', '', '', 'man', 'Sin', '', '', '', 'miNzi, SiNmiN']
WARAO : ['ine', 'zatu', 'oko', 'tamaha', 'tai', 'sina', 'bitu', 'XXX', 'kokotuka', 'era', 'hishaka', 'manamu', 'irija', 'bumija', 'sanuka', 'tija', 'nibora', 'warau', 'homakaba', 'domu', 'beroro', 'ami', 'dau', 'amu', 'dau aroko', 'XXX', 'ahoro', 'horo', 'toma', 'hotu', 'muhu', 'toi', 'ahi', 'akw~ahoi', 'ahu', 'huhi', 'hio', 'kw~a', 'kohoko', 'mu', 'hikoto', 'doko', 'i', 'hono', 'kahanobo, mohusi', 'omu', 'mukuru', 'moho', 'obono', 'do', 'ami', 'kobe', 'mahi', 'takatakaza', 'nahoroza', 'basia', 'mia', 'nokoza', 'naminaza', 'ubaza', 'wabaza', 'naza', 'soitia', 'nebiria', 'naria, za*tia', 'nauza', 'zahia', 'duhuya', 'kanamuya', 'muaza', 'dibu', 'za', 'waniku', 'kura', 'ho', 'naha', 'hozo', 'huhu', 'hobahi', 'nahamutu', 'hehuku', 'hekunu', 'hekohuhu', 'ehohuya', 'hohisi', 'hotakw~ai', 'simo*', 'hebura', 'simosimo, johene', 'hokera', 'anera', 'ima', 'ihija', 'daitera, dehorohera', 'kw~atai', 'hijo', 'zakera', 'kobera', 'nauwaha', 'wai']
KAREN_GEBA : ['ya', 'na', 'pwa', '', '', '', '', '', '', '', 't3bw~a', 'Ci bw~a', '', '', '', '', '', 'by~a', 'ta ph~o', '', 'thw$i*7', 'tr~o7', 'tr~o7', '', 'La*7', '', '', '3ph~3i7', '', 'tr~wi*7', 'khw$i*7', '', '', 'ta 73no', '', '', '', '', 'k3ni7 ku', 'ka ka dr~u', 'k3ni kh~3de', '', 'kotr~o', 'k3pli', '', '', 'kh~a lo ma*7', 's3 kh~o', '', '', 'XXX', '', 'k3to tr~a*7', 'o', '', '', '3sa Ci', 'k3tr~a ha', '', '', 'tr~i', '', '', '', '', 'ke ba*7', '', '', '', '', '', 'lu mu', '', 'sya', 'Ci', '', 'lo7', '', '', '', '', 'mi7', '', '', 'kla*7 do7', 'kh~o la7', '', '', '', '', '', 'lu mu na kh~a, na kh~a', '', '', 'pw~a th~a*7', '3tr~a', '', '', '', 'k3sh~o7 mi']

From this dict it's easy to extract required language(s) or word(s).

于 2014-09-16T15:41:32.800 回答
0

在您打开的文件上使用 readlines() 您可以拥有行的索引,因此:

infile = open('listss16.txt')
lines = infile.readlines()

for line in range(0,len(lines)):
    for l in langlist:
        if l in lines[line]:
            outfile.write(lines[line:line+42])

或一次性写一次:

out = [lines[line:line+42] for l in langlist for line in range(0,len(lines)) if l in lines[line]]
于 2014-09-16T15:44:24.223 回答
0
  1. 300000 行文本并不多,可以轻松放入几百 MB。除非这对时间敏感,否则请以愚蠢的方式将其全部加载到 list 中

  2. 在字典而不是列表中收集所有语言名称。

然后遍历巨大的文本文件:

for i, current_line in input_list:
    if current_line in languages:
        language_block = input_list[i:i + 43]
        # do something with it

一旦你有了这个,并且你想最小化内存消耗,不要加载整个文件,而是continue在遍历所有行时跳过 42 行。

于 2014-09-16T15:43:02.560 回答