Reading from a file

In [1]:
file = open("/Users/koller/Downloads/bg.txt", "r", encoding="utf-8")

Notice the encoding="utf-8" argument. This instructs the open function to assume that the text in the file is encoded with UTF-8. If you leave the encoding argument out, open uses the default character encoding of your operating system.

In [2]:
file.read()[:1000]
Out[2]:
'Местните избори в Хърватия вървят към втори тур\nРезултатите показаха липса на категорични победи в първия тур, особено в повечето големи градове.\nА наблюдателите на изборите докладваха за нарушения на забраната за провеждане на кампании пред изборните секции в изборния ден.\nОт Наташа Радич за Southeast European Times от Загреб -- 21/05/09\nХърватите гласуваха в неделя (17 май) на местни и регионални избори. [Гети Имиджис]\nСлед като изборните секции бяха затворени в неделя (17 май) за местните избори, предварителните резултати показаха, че единствено в Риека от големите градове избирателите са избрали кмет на първия тур.\nВ другите градове на Хърватия нито един кандидат не спечели категорична победа.\nБяха пуснати общо 1,9 милиона бюлетини.\nЗа първи път, откакто Хърватия обяви независимост през 1991 г., избирателите пряко избраха 866 свои представители в 21 окръжни съвета, 2 206 представители в 126 градски съвета и 5 343 представители в 427 общински съвета.\nОбщо 46 325 кандидати взеха учас'

The read method reads the entire file into one string. You can then manipulate this string as usual, e.g. by splitting it into its whitespace-separated parts using the split method.

In [3]:
"foo bar".split()
Out[3]:
['foo', 'bar']
In [2]:
words = []

If instead of calling the read method, you simply iterate over the file object with a for loop, Python will process the file line by line.

The extend method adds all elements of one list to another list.

In [7]:
file = open("/Users/koller/Downloads/bg.txt", encoding="utf-8")
for line in file:
    words.extend(line.split())
In [8]:
words
Out[8]:
['Местните',
 'избори',
 'в',
 'Хърватия',
 'вървят',
 'към',
 'втори',
 'тур',
 'Резултатите',
 'показаха',
 'липса',
 'на',
 'категорични',
 'победи',
 'в',
 'първия',
 'тур,',
 'особено',
 'в',
 'повечето',
 'големи',
 'градове.',
 'А',
 'наблюдателите',
 'на',
 'изборите',
 'докладваха',
 'за',
 'нарушения',
 'на',
 'забраната',
 'за',
 'провеждане',
 'на',
 'кампании',
 'пред',
 'изборните',
 'секции',
 'в',
 'изборния',
 'ден.',
 'От',
 'Наташа',
 'Радич',
 'за',
 'Southeast',
 'European',
 'Times',
 'от',
 'Загреб',
 '--',
 '21/05/09',
 'Хърватите',
 'гласуваха',
 'в',
 'неделя',
 '(17',
 'май)',
 'на',
 'местни',
 'и',
 'регионални',
 'избори.',
 '[Гети',
 'Имиджис]',
 'След',
 'като',
 'изборните',
 'секции',
 'бяха',
 'затворени',
 'в',
 'неделя',
 '(17',
 'май)',
 'за',
 'местните',
 'избори,',
 'предварителните',
 'резултати',
 'показаха,',
 'че',
 'единствено',
 'в',
 'Риека',
 'от',
 'големите',
 'градове',
 'избирателите',
 'са',
 'избрали',
 'кмет',
 'на',
 'първия',
 'тур.',
 'В',
 'другите',
 'градове',
 'на',
 'Хърватия',
 'нито',
 'един',
 'кандидат',
 'не',
 'спечели',
 'категорична',
 'победа.',
 'Бяха',
 'пуснати',
 'общо',
 '1,9',
 'милиона',
 'бюлетини.',
 'За',
 'първи',
 'път,',
 'откакто',
 'Хърватия',
 'обяви',
 'независимост',
 'през',
 '1991',
 'г.,',
 'избирателите',
 'пряко',
 'избраха',
 '866',
 'свои',
 'представители',
 'в',
 '21',
 'окръжни',
 'съвета,',
 '2',
 '206',
 'представители',
 'в',
 '126',
 'градски',
 'съвета',
 'и',
 '5',
 '343',
 'представители',
 'в',
 '427',
 'общински',
 'съвета.',
 'Общо',
 '46',
 '325',
 'кандидати',
 'взеха',
 'участие',
 'в',
 'изборите.',
 'Първоначалните',
 'официални',
 'резултати',
 'показаха,',
 'че',
 'управляващият',
 'Хърватски',
 'демократичен',
 'съюз',
 '(ХДС)',
 'е',
 'спечелил',
 'изборите',
 'в',
 '14',
 'окръга.',
 'Той',
 'обаче',
 'не',
 'успя',
 'да',
 'спечели',
 'убедително',
 'в',
 'четирите',
 'най-големи',
 'градове',
 '–',
 'Загреб,',
 'Сплит,',
 'Риека',
 'и',
 'Осиек.',
 'Опозиционната',
 'Социалдемократическа',
 'партия',
 '(СДП)',
 'спечели',
 'в',
 'пет',
 'окръга',
 'и',
 'успя',
 'да',
 'си',
 'запази',
 'кметството',
 'в',
 'Риека',
 'още',
 'на',
 'първия',
 'тур.',
 'Кандидатите',
 'от',
 'СДП',
 'ще',
 'се',
 'надпреварват',
 'на',
 'балотажите',
 'в',
 'двата',
 'най-големи',
 'града',
 'на',
 'страната,',
 'Загреб',
 'и',
 'Сплит.',
 'Избирайки',
 'свои',
 'общински',
 'лидери',
 'за',
 'първи',
 'път,',
 'избирателите',
 'очевидно',
 'са',
 'обърнали',
 'по-голямо',
 'внимание',
 'на',
 'постиженията',
 'и',
 'политическите',
 'програми',
 'на',
 'кандидатите,',
 'отколкото',
 'да',
 'следват',
 'традицията',
 'да',
 'проверяват',
 'най-напред',
 'партийната',
 'им',
 'принадлежност.',
 'Нещо',
 'повече,',
 'независимите',
 'кандидати',
 'водеха',
 'кампании',
 'без',
 'подкрепата',
 'на',
 'партийни',
 'апарати',
 '–',
 'смятани',
 'в',
 'миналото',
 'за',
 'решаващи',
 'за',
 'победата',
 '–',
 'особено',
 'в',
 'по-големите',
 'градове.',
 'Независимите',
 'имаха',
 'особено',
 'голям',
 'успех',
 'в',
 'Загреб',
 'и',
 'Сплит.',
 'В',
 'Загреб',
 'подкрепяният',
 'от',
 'СДП',
 'кмет',
 'Милан',
 'Бандич',
 'не',
 'успя',
 'да',
 'прескочи',
 'границата',
 'от',
 '50',
 '%,',
 'необходима',
 'за',
 'победа',
 'на',
 'първия',
 'тур,',
 'с',
 'което',
 'опроверга',
 'предизборните',
 'проучвания.',
 'Той',
 'спечели',
 '48,54',
 '%',
 'от',
 'гласовете.',
 'Съперникът',
 'му,',
 'досега',
 'неизвестният',
 'университетски',
 'професор',
 'и',
 'независим',
 'кандидат',
 'Йосип',
 'Крегар,',
 'спечели',
 '23,18',
 '%.',
 'В',
 'Сплит',
 'скандалният',
 'бизнесмен',
 'и',
 'кандидат',
 'за',
 'първи',
 'път',
 'Желко',
 'Керум',
 'събра',
 '40,21',
 '%,',
 'а',
 'класиралият',
 'се',
 'на',
 'второ',
 'място',
 'кандидат',
 'на',
 'СДП',
 'Ранко',
 'Остоич',
 'спечели',
 '34,72',
 '%.',
 'В',
 'Осиек',
 'Крешимир',
 'Бубало,',
 'член',
 'на',
 'Хърватската',
 'демократична',
 'партия',
 'на',
 'Славония',
 'и',
 'Бараня',
 '(ХДПСБ)',
 'на',
 'осъдения',
 'военнопрестъпник',
 'Бранимир',
 'Главаш,',
 'спечели',
 '38,71',
 '%',
 'от',
 'гласовете,',
 'а',
 'председателят',
 'на',
 'Хърватската',
 'партия',
 'на',
 'правата',
 '(ХПП)',
 'Анто',
 'Джапич',
 'получи',
 '22,94',
 '%,',
 'което',
 'той',
 'призна',
 'за',
 '„слаб',
 'резултат”.',
 'След',
 'като',
 'националната',
 'избирателна',
 'комисия',
 'потвърди',
 'резултатите,',
 'вторият',
 'тур',
 'ще',
 'започне',
 'на',
 '31',
 'май.',
 'ГОНГ,',
 'хърватска',
 'НПО',
 'за',
 'наблюдение',
 'на',
 'изборите,',
 'мобилизира',
 '700',
 'свои',
 'наблюдатели.',
 'ГОНГ',
 'съобщи,',
 'че',
 'е',
 'получила',
 'над',
 '250',
 'оплаквания,',
 'най-вече,',
 'но',
 'не',
 'само,',
 'от',
 'партийни',
 'активисти,',
 'нарушили',
 'забраната',
 'за',
 'агитация',
 'в',
 'изборния',
 'ден',
 'и',
 'правили',
 'опити',
 'да',
 'влияят',
 'и',
 'заплашват',
 'избиратели',
 'пред',
 'и',
 'около',
 'избирателните',
 'секции.',
 'Тя',
 'докладва',
 'и',
 'за',
 'няколко',
 'случая',
 'на',
 'насилие.',
 'Евродепутати',
 'призовават',
 'към',
 'преговори',
 'за',
 'членство',
 'с',
 'Македония',
 'В',
 'сряда',
 'членовете',
 'на',
 'Европейския',
 'парламент',
 'гласуваха',
 'с',
 'мнозинство',
 'в',
 'покрепа',
 'на',
 'доклад',
 'за',
 'Македония,',
 'призоващ',
 'лидерите',
 'на',
 'ЕС',
 'да',
 'обсъдят',
 'определянето',
 'на',
 'дата',
 'за',
 'започване',
 'на',
 'преговори',
 'за',
 'членство',
 'с',
 'правителството.',
 '(Евронюз,',
 'СНА',
 '-',
 '24/04/08;',
 'Блумбърг,',
 'EUobserver,',
 'Болкън',
 'Инсайт,',
 'Maкфакс,',
 'Европейски',
 'парламент',
 '-',
 '23/04/08)',
 'Членовете',
 'на',
 'Европейския',
 'парламент',
 'гласуваха',
 'с',
 'преобладаващо',
 'мнозинство',
 'в',
 'подкрепа',
 'на',
 'доклад,',
 'призоваващ',
 'лидерите',
 'на',
 'ЕС',
 'да',
 'обсъдят',
 'започването',
 'на',
 'преговори',
 'със',
 'Скопие',
 'преди',
 'края',
 'на',
 'тази',
 'година.',
 '[ЕС]',
 'Европейският',
 'парламент',
 '(ЕП)',
 'прие',
 'доклад',
 'в',
 'сряда',
 '(23',
 'април),',
 'призоваващ',
 'ЕС',
 'да',
 'започне',
 'преговори',
 'за',
 'членство',
 'с',
 'Македония',
 'преди',
 'края',
 'на',
 'тази',
 'година,',
 'ако',
 'страната',
 'изпълни',
 'предварителните',
 'условия.',
 'Македония',
 'чака',
 'определянето',
 'на',
 'дата',
 'за',
 'започване',
 'на',
 'присъдинителните',
 'преговори',
 'от',
 'декември',
 '2005',
 'г.,',
 'когато',
 'тя',
 'се',
 'присъедини',
 'към',
 'списъка',
 'на',
 'Съюза',
 'със',
 'страни',
 'кандидатки,',
 'включително',
 'Хърватия',
 'и',
 'Турция.',
 'Приветствайки',
 '"значителния',
 'напредък",',
 'постигнат',
 'от',
 'Македония',
 'оттогава,',
 'Докладът',
 'за',
 'напредъка',
 'на',
 'Македония',
 'на',
 'ЕП',
 'за',
 '2007',
 'г.',
 'призова',
 'страната',
 'да',
 'осъществи',
 'реформите,изисквани',
 'от',
 'ЕС',
 'включително',
 'списък',
 'с',
 'осем',
 'критерии,',
 'които',
 'тя',
 'получи',
 'наскоро.',
 'В',
 'документа,',
 'одобрен',
 'от',
 '601',
 'срещу',
 '52',
 'гласа',
 'в',
 '785-местния',
 'законодателен',
 'орган',
 'на',
 'ЕС',
 'в',
 'сряда,',
 'се',
 'изразява',
 'надежда,',
 'че',
 'изпълнението',
 'на',
 'критериите',
 '"ще',
 'доведе',
 'от',
 'започване',
 'на',
 'присъединителните',
 'преговори',
 'преди',
 'края',
 'на',
 '2008',
 'г.".',
 'Евродепутатите',
 'призоваха',
 'лидерите',
 'на',
 'блока',
 'да',
 'обмислят',
 'даването',
 'на',
 'зелена',
 'светлина',
 'на',
 'преговорите',
 'за',
 'присъединяването',
 'на',
 'Македония',
 'на',
 'срещата',
 'им',
 'на',
 'върха',
 'през',
 'юни.',
 'Те',
 'подчертаха,',
 'че',
 'спорът',
 'между',
 'Македония',
 'и',
 'Гърция',
 'за',
 'името,',
 'който',
 'продължава',
 'вече',
 '17',
 'години,',
 'не',
 'трябва',
 'да',
 'попречи',
 'на',
 'присъединяването',
 'й',
 'към',
 'Съюза.',
 'Гърция',
 'отказва',
 'да',
 'признае',
 'своята',
 'северна',
 'съседка',
 'с',
 'нейното',
 'конституционно',
 'име',
 'Република',
 'Македония,',
 'смятайки',
 'го',
 'за',
 'потенциална',
 'териториална',
 'претенция',
 'към',
 'нейната',
 'собствена',
 'провинция',
 'Македония.',
 'Атина',
 'продължава',
 'да',
 'нарича',
 'балканската',
 'страна',
 'Бивша',
 'Югославска',
 'Република',
 'Македония',
 '(БЮРМ).',
 'Макар',
 'че',
 'двете',
 'страни',
 'удвоиха',
 'усилията',
 'си',
 'за',
 'намиране',
 'на',
 'решение',
 'през',
 'последните',
 'месеци,',
 'те',
 'отхвърлиха',
 'множество',
 'предложения',
 'за',
 'компромис,',
 'направени',
 'от',
 'посредника',
 'на',
 'ООН',
 'в',
 'преговорите',
 'между',
 'тях',
 'Матю',
 'Нимец.',
 'В',
 'началото',
 'на',
 'този',
 'месец',
 'Гърция',
 'блокира',
 'покана',
 'към',
 'Македония',
 'за',
 'членство',
 'в',
 'НАТО.',
 'Атина',
 'също',
 'заплаши',
 'да',
 'попречи',
 'на',
 'Македония',
 'да',
 'се',
 'приближи',
 'към',
 'членство',
 'в',
 'ЕС,',
 'докато',
 'не',
 'бъде',
 'решен',
 'спорът',
 'с',
 'името.',
 'Законодателите',
 'на',
 'ЕС',
 '"призовават',
 'и',
 'двете',
 'страни',
 'да',
 'се',
 'възползват',
 'от',
 'възможността',
 'да',
 'възобновят',
 'незабавно',
 'преговорите...',
 'и',
 'да',
 'постигнат',
 'компромисно',
 'решение,"',
 'се',
 'казва',
 'в',
 'доклада',
 'от',
 'сряда.',
 'Евродепутатите',
 'също',
 'призоваха',
 'управляващата',
 'коалиция',
 'в',
 'Македония',
 'да',
 'гарантира',
 'провеждането',
 'на',
 'честни',
 'и',
 'демократични',
 'парламентарни',
 'избори',
 'на',
 '1',
 'юни.',
 'Те',
 'изразиха',
 'надежда,',
 'че',
 'вотът',
 'няма',
 'да',
 'попречи',
 'на',
 'подготовката',
 'на',
 'Скопие',
 'за',
 'започване',
 'на',
 'преговори',
 'с',
 'ЕС.',
 'Докладът',
 'приветства',
 'напредъка,',
 'постигнат',
 'от',
 'македонските',
 'власти',
 'в',
 'осъществяването',
 'на',
 'Охридското',
 'рамково',
 'споразумение',
 'от',
 '2001',
 'г.,',
 'посветено',
 'на',
 'междуетническите',
 'отношения',
 'в',
 'страната,',
 'но',
 'порицаха',
 '"продължаващата',
 'дискриминация',
 'срещу',
 'ромската',
 'общност".',
 'Подчертавайки',
 'значението',
 'на',
 'добросъседските',
 'отношения,',
 'евродепутатите',
 'призоваха',
 'властите',
 'да',
 'се',
 'съобразяват',
 'с',
 'исканията',
 'на',
 'ЕС',
 'за',
 '"противопоставяне',
 'на',
 'появата',
 'на',
 '"изявления',
 'на',
 'омраза",',
 'особено',
 'в',
 'медиите',
 'срещу',
 'съседни',
 'страни".',
 'Докладът',
 'на',
 'ЕП',
 'приветства',
 '"конструктивната',
 'позиция"',
 'на',
 'Македония',
 'за',
 'статута',
 'на',
 'Косово',
 'и',
 'активното',
 'й',
 'търговско',
 'сътрудничество',
 'с',
 'най-новата',
 'европейска',
 'държава.',
 'Евродепутатите',
 'също',
 'призоваха',
 'за',
 'стъпки',
 'към',
 'решаване',
 'на',
 'въпроса',
 'за',
 'границата',
 'между',
 'Македония',
 'и',
 'Косово',
 'в',
 'съответствие',
 'с',
 'предложението',
 'на',
 'специалния',
 'пратеник',
 'на',
 'ООН',
 'Марти',
 'Ахтисаари.',
 ...]

Analyzing the corpus from the file

You can analyze the corpus you read from the file exactly like the one we got from nltk.corpus.brown earlier.

In [9]:
len(words)
Out[9]:
4323846
In [10]:
len(set(words))
Out[10]:
224070
In [11]:
import nltk
fdist = nltk.FreqDist(words)
In [12]:
high_freqs = sorted(fdist.values(), reverse=True)[:100]
In [13]:
%matplotlib inline
import matplotlib
import matplotlib.pyplot
matplotlib.pyplot.plot(high_freqs)
Out[13]:
[<matplotlib.lines.Line2D at 0x13e4bdc88>]

Reading CSV files

One cool thing about Python is that the standard library already contains lots of functions and classes to make your life easier. Be sure to always check the standard library before you implement common functionality yourself. Here we play the name-learning game from Tuesday using a file in which course participants are given as tab-separated values (TSV). This can be done using the CSV module.

In [10]:
with open("participants.tsv", "r", encoding="utf-8") as file:
    print(file.read())
Name	Nationality	Program	Previous degree
Allén, Axel	FI	LST	BA English/Linguistics
Amin, Saadullah	PK	-- (DFKI)	BSc Electrical Engineering
Bernhard, Johannes	DE	LST	BA Comparative Linguistics
Bhanja, Ayushi	IN	LST	MA Linguistics
Chen, Yu-Wen	TW	LCT	BA Applied Foreign Languages
Christian, Katharina	DE	BSc Bioinformatik	
Das, Priyanka	IN	LST	M.Tech Computer Science & Engineering
Donatelli, Lucia	US	--	PhD Linguistics
Georgis, Philipp	US	LST	BA Linguistics
In [14]:
import csv

with open("participants.tsv", "r", encoding="utf-8") as file:
    csv_reader = csv.reader(file, delimiter='\t')
    next(csv_reader) # skip first line, it is just the header
    participants = []
    
    for row in csv_reader:
        participants.append(row)

participants
Out[14]:
[['Allén, Axel', 'FI', 'LST', 'BA English/Linguistics'],
 ['Amin, Saadullah', 'PK', '-- (DFKI)', 'BSc Electrical Engineering'],
 ['Bernhard, Johannes', 'DE', 'LST', 'BA Comparative Linguistics'],
 ['Bhanja, Ayushi', 'IN', 'LST', 'MA Linguistics'],
 ['Chen, Yu-Wen', 'TW', 'LCT', 'BA Applied Foreign Languages'],
 ['Christian, Katharina', 'DE', 'BSc Bioinformatik', ''],
 ['Das, Priyanka', 'IN', 'LST', 'M.Tech Computer Science & Engineering'],
 ['Donatelli, Lucia', 'US', '--', 'PhD Linguistics'],
 ['Georgis, Philipp', 'US', 'LST', 'BA Linguistics']]
In [17]:
for i in range(len(participants)):
    me = participants[i]
    print(f"I am {me[0]} from {me[1]}, and my degree is {me[3]}.")
    for j in range(i):
        print(f"   He/she is {participants[j][0]} from {participants[j][1]}.")
    print()
I am Allén, Axel from FI, and my degree is BA English/Linguistics.

I am Amin, Saadullah from PK, and my degree is BSc Electrical Engineering.
   He/she is Allén, Axel from FI.

I am Bernhard, Johannes from DE, and my degree is BA Comparative Linguistics.
   He/she is Allén, Axel from FI.
   He/she is Amin, Saadullah from PK.

I am Bhanja, Ayushi from IN, and my degree is MA Linguistics.
   He/she is Allén, Axel from FI.
   He/she is Amin, Saadullah from PK.
   He/she is Bernhard, Johannes from DE.

I am Chen, Yu-Wen from TW, and my degree is BA Applied Foreign Languages.
   He/she is Allén, Axel from FI.
   He/she is Amin, Saadullah from PK.
   He/she is Bernhard, Johannes from DE.
   He/she is Bhanja, Ayushi from IN.

I am Christian, Katharina from DE, and my degree is .
   He/she is Allén, Axel from FI.
   He/she is Amin, Saadullah from PK.
   He/she is Bernhard, Johannes from DE.
   He/she is Bhanja, Ayushi from IN.
   He/she is Chen, Yu-Wen from TW.

I am Das, Priyanka from IN, and my degree is M.Tech Computer Science & Engineering.
   He/she is Allén, Axel from FI.
   He/she is Amin, Saadullah from PK.
   He/she is Bernhard, Johannes from DE.
   He/she is Bhanja, Ayushi from IN.
   He/she is Chen, Yu-Wen from TW.
   He/she is Christian, Katharina from DE.

I am Donatelli, Lucia from US, and my degree is PhD Linguistics.
   He/she is Allén, Axel from FI.
   He/she is Amin, Saadullah from PK.
   He/she is Bernhard, Johannes from DE.
   He/she is Bhanja, Ayushi from IN.
   He/she is Chen, Yu-Wen from TW.
   He/she is Christian, Katharina from DE.
   He/she is Das, Priyanka from IN.

I am Georgis, Philipp from US, and my degree is BA Linguistics.
   He/she is Allén, Axel from FI.
   He/she is Amin, Saadullah from PK.
   He/she is Bernhard, Johannes from DE.
   He/she is Bhanja, Ayushi from IN.
   He/she is Chen, Yu-Wen from TW.
   He/she is Christian, Katharina from DE.
   He/she is Das, Priyanka from IN.
   He/she is Donatelli, Lucia from US.

In [ ]: