【发布时间】:2021-11-17 05:01:13
【问题描述】:
我们将在一个单独的目录中接收多达 10k 个 JSON 文件,这些文件必须被解析并转换为单独的 .csv 文件。然后必须将每个 URL 中的文件下载到另一个目录。我计划在 Mac 上的 Automator 中执行此操作并调用 Python 脚本来下载文件。我已经完成了 shell 脚本的一部分以转换为 CSV,但不知道从哪里开始使用 python 来下载 URL。
这是迄今为止我对 Automator 的了解:
- Shell = /bin/bash
- Pass input = as arguments
- Code = as follows
#!/bin/bash
/usr/bin/perl -CSDA -w <<'EOF' - "$@" > ~/Desktop/out_"$(date '+%F_%H%M%S')".csv
use strict;
use JSON::Syck;
$JSON::Syck::ImplicitUnicode = 1;
# json node paths to extract
my @paths = ('/upload_date', '/title', '/webpage_url');
for (@ARGV) {
my $json;
open(IN, "<", $_) or die "$!";
{
local $/;
$json = <IN>;
}
close IN;
my $data = JSON::Syck::Load($json) or next;
my @values = map { &json_node_at_path($data, $_) } @paths;
{
# output CSV spec
# - field separator = SPACE
# - record separator = LF
# - every field is quoted
local $, = qq( );
local $\ = qq(\n);
print map { s/"/""/og; q(").$_.q("); } @values;
}
}
sub json_node_at_path ($$) {
# $ : (reference) json object
# $ : (string) node path
#
# E.g. Given node path = '/abc/0/def', it returns either
# $obj->{'abc'}->[0]->{'def'} if $obj->{'abc'} is ARRAY; or
# $obj->{'abc'}->{'0'}->{'def'} if $obj->{'abc'} is HASH.
my ($obj, $path) = @_;
my $r = $obj;
for ( map { /(^.+$)/ } split /\//, $path ) {
if ( /^[0-9]+$/ && ref($r) eq 'ARRAY' ) {
$r = $r->[$_];
}
else {
$r = $r->{$_};
}
}
return $r;
}
EOF
【问题讨论】:
-
如果你想从 URL 下载文件,你应该考虑在 python 中使用
requests模块 -
你收到了反对票,因为 A. 你没有尝试自己先解决问题,B. 没有产生 minimum reproducible example,C. 已经有多个 questions 提出相同的问题事物。此问题表明您没有尝试解决问题,而是依靠他人为您完成工作。
标签: python python-3.x automator