Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 21 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save Joilence/82e1433870c538db12086e06ac7975f7 to your computer and use it in GitHub Desktop.
Save Joilence/82e1433870c538db12086e06ac7975f7 to your computer and use it in GitHub Desktop.
Convert date format in file names and contents from Roam Research default style to Obsidian default style.
import re
import os
from dateutil.parser import parse
path = '' #insert file path to your vault here
### Convert date format in file content
for root, dirs, files in os.walk(path):
files = [f for f in files if re.match(r'.*\.md', f)] # only keep files end with `.md`
#TODO: could better ignore all dirs with `.` like `.git`
for f in files:
fullpath = (os.path.join(root, f))
with open(fullpath, 'r') as f: #opens each .md file
contents = f.read() #reads the contents
#substitutes dates with the format [[April 20th, 2020]] for [[2020-04-20]]
new_contents = re.sub(r'(?<=\[)[\w]+\s\d{1,2}\w{1,2},\s\d{4}(?=\])',
lambda x: str(parse(x.group(0), ignoretz=True)).split(" ")[0], contents, flags=re.M)
with open(fullpath, 'w') as f:
f.write(new_contents) #writes the files with the new substitutions
### Convert daily notes names
for root, dirs, files in os.walk(path):
files = [f for f in files if re.match(r'[\w]+\s\d{1,2}\w{1,2},\s\d{4}\.md', f)]
for f in files:
fullpath = (os.path.join(root, f))
new_fullpath = re.sub(r'[\w]+\s\d{1,2}\w{1,2},\s\d{4}',
lambda x: str(parse(x.group(0), ignoretz=True)).split(" ")[0], fullpath, flags=re.M)
os.rename(fullpath, new_fullpath)
@camin-mccluskey
Copy link

camin-mccluskey commented May 9, 2023

@max-fedoseev just in case you haven't found an answer elsewhere. To run code inside Obsidian you need to create a code block in your note like the following:

```run-python
import re
import os
from dateutil.parser import parse

....

```

Make sure the indentation is correct as you see above

@bmalbert22
Copy link

bmalbert22 commented Jan 31, 2024

What did you try yet? @jeom123

-> https://lmgtfy.app/#gsc.tab=0&gsc.q=UnicodeDecodeError%3A%20'charmap'%20codec%20can't%20decode%20byte%200x9d%20 you should try the first result. Change line 16 to

with open(fullpath, 'r', encoding="utf8") as f:

Foy my case I found that the markdown files that Roam exported were actually encoded in ANSI.
So on line 17, AND ON LINE 22, rather than

with open(fullpath, 'r', encoding="utf8") as f:

I wrote

with open(fullpath, 'r', encoding="ANSI") as f:

and everything worked fine.

Apparently there are some special characters that are different between the two. I only checked the characters in two files, but in one it was an apostrophe that it didn't like and in another it was a hyphen.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment