Les données exportées du calendrier OS X et de Google Agenda sont au format ical, mais il est un peu gênant de les afficher même si elles sont enregistrées telles quelles en tant qu'enregistrement passé, donc un fichier texte avec la date et l'heure et le nom de l'événement sur une seule ligne Je voulais le garder. J'ai cherché sur le net et j'ai trouvé le package icalendar pour Python.
Téléchargez le package qui gère le format ical en Python à partir du site suivant.
https://pypi.python.org/pypi/icalendar
Au moment où je l'ai téléchargé, c'était icalendar 3.10 et il prend en charge Python 2.6, 2.7 et 3.3+.
Décompressez le fichier .zip téléchargé à partir de ce qui précède, déplacez-vous vers ce dossier dans le terminal et installez avec la commande suivante.
$ python setup.py install
## Un programme qui récupère les événements des données ical
Le programme Python qui lit un fichier au format ical et le produit en sortie standard est le suivant.
L'utilisation est la suivante
#### **`$ python iCal2txt.py file | sort > output file`**
```py file | sort > output file
Exemple d'utilisation: `` `` $ python iCal2txt.py yotei2016.ical | sort> calendar2016.txt` ``
Désormais, "calendar2016.txt" est généré sous forme de données texte qui extrait la date et l'heure et le nom de l'événement des données de "yotei2016.ical" et les trie par ordre de date et d'heure.
La source du programme Python est la suivante
#### **`iCal2txt.py`**
```python
#!/usr/bin/python
# -*- coding: utf-8 -*-
import codecs
import sys
from icalendar import Calendar, Event
from datetime import datetime
argvs = sys.argv
fin = codecs.open(argvs[1])
cal = Calendar.from_ical(fin.read())
body = ""
for ev in cal.walk():
if ev.name == 'VEVENT':
start_dt = ev.decoded("dtstart")
end_dt = ev.decoded("dtend")
summary = ev['summary'].encode('utf-8')
print "{start} - {end} : {summary}".format(start=start_dt.strftime("%Y/%m/%d %H:%M"), end=end_dt.strftime("%Y/%m/%d %H:%M"), summary=summary)
Quelle heure était cet événement avec ce fichier? C'est facile à découvrir.
J'avais l'habitude d'écrire un script qui récupère un fichier similaire à partir d'une application iCal avec AppleScript, mais l'écrire en Python est assez facile et j'aime Python. (Parce qu'il y avait un paquet)
Si vous n'avez pas besoin de trier, il est difficile de spécifier le fichier de sortie, j'ai donc ajouté .txt au nom du fichier d'entrée et l'ai sorti.
ical2txt2.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import codecs
import os
import sys
from icalendar import Calendar, Event
from datetime import datetime
argvs = sys.argv
fin = codecs.open(argvs[1])
cal = Calendar.from_ical(fin.read())
fin.close()
ldata = ""
for ev in cal.walk():
if ev.name == 'VEVENT':
start_dt = ev.decoded("dtstart")
end_dt = ev.decoded("dtend")
summary = ev['summary'].encode('utf-8')
ldata += "{start} - {end} : {summary}".format(start=start_dt.strftime("%Y/%m/%d %H:%M"), end=end_dt.strftime("%Y/%m/%d %H:%M"), summary=summary) + os.linesep
fname,ext = (sys.argv[1]).split(".",1)
fout = fname + ".txt"
f = codecs.open(fout, "w")
f.write(ldata)
f.close()
Lors du tri dans le programme, les caractères étaient déformés, j'ai donc essayé de sortir avant le tri comme décrit ci-dessus, mais j'ai pu éliminer les caractères déformés.
La source est la suivante.
Modifiez le code de saut de ligne de sortie en fonction de votre environnement.
(Puisque le comportement de os.linesep
était étrange, le code de saut de ligne est spécifié directement.)
Exemple d'utilisation:
$ python ical2txt.py yotei2016.ics` ``
ical2txt3.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import codecs
import os
import sys
from icalendar import Calendar, Event
from datetime import datetime
argvs = sys.argv
fin = codecs.open(argvs[1])
cal = Calendar.from_ical(fin.read())
fin.close()
li = []
for ev in cal.walk():
if ev.name == 'VEVENT':
start_dt = ev.decoded("dtstart")
end_dt = ev.decoded("dtend")
summary = ev['summary'].encode('utf-8')
li.append("{start} - {end} : {summary}".format(start=start_dt.strftime("%Y/%m/%d %H:%M"), end=end_dt.strftime("%Y/%m/%d %H:%M"), summary=summary).decode('utf-8'))
li.sort()
fname,ext = (sys.argv[1]).split(".",1)
fout = fname + ".txt"
f = codecs.open(fout, "w")
for ld in li:
f.write(ld.encode('utf-8') + "\n")
f.close()
Recommended Posts