CSV的每一条记录如何转换一个rtf文档?

上次在小众软件提问,如何导出豆瓣高分电影,之后通过脚本导出为一个CSV了

CSV的记录在devonthink是这样:

我想每条记录转换成单个RTF文档,每个RTF的标题就是名称+URL的结合,如下图:

至于为什么搞成单个RTF?因为notion太慢太麻烦,转换成单个RTF易于整理,devonthink本身带有元数据库。

这是CSV的文档
链接: 百度网盘 请输入提取码 密码: pdco
–来自百度网盘超级会员V6的分享

问题也可以定义为,一个记事本有100行记录,如何转换成100个txt/rtf,且txt/rtf的文件名为100行记录的内容。

我想起了终端,好像mk还什么命令,可以批量创建文件

我先简单测试一下Notion的效果
把csv导入Notion的database,再导出来

可以批量导出成markdown文件,但是文件名字有点乱码

尝试表格工具+Obsidian插件refactor

使用Notion或Excel等表格工具

先给表头和元数据加上格式信息
我这里测试就只给电影名称加了一个「一级标题 #」,其他元数据可以按需加,用表格工具的公式

使用Obsidian,安装插件note-refactor-obsidian

把数据在表格整理成这样,再粘贴到Obsidian中的一个文档中
(我这里处理得比较粗糙)

运行插件,按照一级标题拆分

就得到了一大堆markdown文件


这个方案在理论上讲是可以很好实现需求的


(已删减,原先插图太多)

思路

制作数据

Notion 的公式:
做一栏代表文件名
做一栏代表网址
做一栏代表元数据:分数

拷贝到文本编辑器中

用正则表达式查找替换,预处理完毕

Obsidian 插件 refactor

一键搞定

突然想起来文件标题不能有这种特殊字符: /,不知道还能不能实现楼主的需求了

再用pandoc把markdown转成RTF

还可以用renamer再改改名(renamer支持表格,有表格在手,数据什么的都好说)


这套流程看起来很折腾,但我自己5分钟搞定
(已删减,原来的图片太占版面了)

需要 Python 3.6+

import csv
from sys import platform

def main():
    print("begin")
    with open('data.csv', 'r', encoding="utf8") as csvfile:
        reader = csv.reader(csvfile)
        next(reader) # skip header
        for row in reader:
            title, url = row[0], row[1]
            if platform == "win32":
                # escape filename
                url = url.replace('/', '-').replace(':', '-')
            with open(f"{title} {url}.rtf","w") as f:
                pass
    print("done")

if __name__ == "__main__":
    main()
1 Like

这曲折的办法太魔性了.

而且你都求助了, 不能一步到位的求助吗?

notion 有数据库啊.

而且最关键的问题是, URL包含:和/, 是不能作为文件名存在的啊.

1 Like

我在mac,看到代码里有win32,是否要在windows下运行的?

win32 是因为 Windows 下文件名不能有一些特殊符号,所以做了替换。这里的报错是因为没有在你 Finder 打开的 douban 文件夹下运行,要先 cd 过去。

我cd过去了,还是出错

需要把这个 Python 脚本重命名为 csv 之外的其他名字,否则会和 Python 的内置库冲突。

执行到这里,出现了错误

是不是网址里包含了不能作为文件名的符号?

FileNotFoundError: [Errno 2] No such file or directory: ‘神秘博士:DT的视频日志 https://movie.douban.com/subject/10553116/.rtf

抱歉,手头没有 Mac 设备可供尝试。怀疑你的猜测是正确的。可以试试将脚本里 if platform=="win32:" 改成 if True,强制进行特殊符号替换试试。

我修改了,但是运行出错:

我后面测试了一下,主要的特殊符号是:号,因此,只要去掉网址的前面的https就可以了,脚本可以修改为去掉https://吗?谢谢 @jerrylus

我在mac的测试结果,允许/符号,不允许:号

是我没说清楚,11 行应该修改为

if True:

少了一个冒号

以及如果你要去掉 https:// 的话,url = url.replace('/', '-').replace(':', '-') 改为 url = url.replace('https://','').replace('/', '-').replace(':', '-')

这一串 replace 本质上就是替换,参数分别是被替换内容和替换后内容,看你的需要增删就行了