質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3708閲覧

python FTPサーバの中にある最新のCSVファイルをデスクトップに落としてくる方法

Tochan

総合スコア56

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/02/18 16:17

前提・実現したいこと

FTPサーバの中にある最新のCSVファイルをデスクトップに落としてきたいです。
サーバの中には複数ファイルがあります。

試したこと

['dl-item202002051716-1.csv', 'dl-item202002041308-1.csv', 'dl-item202002140959-1.csv']↑の様なファイル名でサーバの中に落ちてきます。

1.0分後~10分後までファイル名に1分刻みの数字を入れたCSVファイルのリストを取得する。
2.サーバーの中に入っている旧ファイル+数分後に落ちくる時間がファイル名に入ったCSVのリストを取得する。

「1」「2」の中からマッチしたCSVファイルをデスクトップにダウンロードしてきたいのですがうまくいきません。
どうしたらいいでしょうか?デスクトップへの書き出しのところでエラー(SyntaxError: invalid syntax)が起こってしまいます。
理由がわかりません。わかる方よろしくお願いします。
素人なので変な方法でやっていると思います。もっとシンプルにする方法などもあれば教えてください。

発生している問題・エラーメッセージ

File "<ipython-input-20-8b89d4231845>", line 32 with open(r'C:\Users\Users\Desktop\' + download, 'wb') as f: ^ SyntaxError: invalid syntax

該当のソースコード

from ftplib import FTP ftp = FTP("upload.***.ne.jp","***",passwd="***") #cd ftp.cwd("/item/download") # ファイル一覧の取得 files = ftp.nlst() # dl-itemファイル一覧の取得 list1 =[s for s in files if 'dl-item' in s] print(list1) from datetime import datetime as dt from datetime import timedelta now = dt.now() list2 = [] for i in range(1,10): list2.append((now + timedelta(minutes=i)).strftime('dl-item%Y%m%d%H%M-1.csv')) print(list2) list(set(list1) & set(list2)) s1 = set(list1) s2 = set(list2) if s1 & s2: print("重複要素があります") download =s1 & s2 print(download) print(type(download)) #ftpからdownloadをダウンロードしてくる。 with open(r'C:\Users\Users\Desktop\' + download, 'wb') as f: ftp.retrlines('RETR %s' % download, f.write) else: print("重複要素がありません")

補足情報(FW/ツールのバージョンなど)

Python 3.7.3
Windows10
jupyter notebook

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

raw stringsの末尾には\は書けません。これはPythonの構文の仕様です。

2. 字句解析 — Python 3.8.2rc2 ドキュメント

面倒くさいかもしれませんが、raw stringsを使うのをやめるか、複数のリテラルに分けて書いてください。

python

1>>> s = "fuga" 2>>> r"hoge\" + s # エラーになる 3 File "<stdin>", line 1 4 r"hoge\" + s 5 ^ 6SyntaxError: EOL while scanning string literal 7>>> r"hoge" "\" + s # 通常のリテラルでエスケープを使えば可。また文字列リテラルを並べると結合される仕様を使っている 8'hoge\fuga' 9

投稿2020/02/18 17:18

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tochan

2020/02/19 11:01 編集

ご連絡ありがとうございます。 「Desktop\」の「\」を取ってみましたが、また違うエラーがでてきました。 ''' with open(r'C:\Users\Users\Desktop' + str(download), 'wb') as f: ftp.retrlines('RETR %s' % download, f.write) ''' エラー↓ error_perm: 550 {'dl-item202002191301-1.csv'}: No such file or directory FTPのディレクトリにファイルがない、と言うことだと思います。 ディレクトリの指定をしてデスクトップにダウンロードしてくるのは どういう風にコードを書いたら良いでしょうか? 素人質問で申し訳ありません。 よろしくお願いします。
otn

2020/02/19 09:22 編集

そのエラーとは関係ないですが、 r'C:\Users\taniguchi\Desktop' + str(download) だと、C:\Users\taniguchi に、Desktopdl-item202002191301-1.csv というファイルができますが。 > raw stringsを使うのをやめるか、複数のリテラルに分けて書いて という回答ですが、コメントなしで回答を無視するのはやめましょう。無視するなら理由をコメントしましょう。 あるいは、回答が理解できない場合は質問しましょう。
hayataka2049

2020/02/19 10:46

> 「Desktop\」の「\」を取ってみましたが、また違うエラーがでてきました。 私の回答の意味を正確に汲めていないであろうことはotnさんのコメントの通りです。 現象としては、構文解析→実行という順で処理されるので、構文エラーがとりあえずなくなった結果、今度は実行時エラーになっています。 > ディレクトリの指定をしてデスクトップにダウンロードしてくるのはどういう風にコードを書いたら良いでしょうか? まずはご自身で調査していただいた上で、どうしても自力で解決できなければ質問本文を修正するか、新しく質問を立ててください。 私はpythonでFTPはやったことがないので、能力的に回答できる保証がありません。また、追加の情報が必要になる可能性も高いです(とりあえずスタックトレース含めたエラー全文とFTPサーバ側のディレクトリ構成は要るかと)。私の回答のコメント欄で進めるべきではないと考えます。
Tochan

2020/02/19 11:11

hayataka2049さん、otnさん、すみません。 回答内容がよくわかっていませんでした。 FTPは別質問を立ててみます。
otn

2020/02/19 11:17

> 回答内容がよくわかっていませんでした。 基礎知識が不足している場合は、そういうのはよくあることです。 回答者に質問を返しましょう。そのためのコメント欄です。
hayataka2049

2020/02/19 11:26 編集

r'C:\Users\Users\Desktop' '\' + str(download)とかでいいんじゃないでしょうか。windowsのファイルパスでは\の代わりに/を使ってもいいので 'C:/Users/Users/Desktop/' + str(download) の方がきれいかもしれません。
otn

2020/02/19 11:25

今回の質問に関しては、 'C:/Users/Users/Desktop/' + download というのが一番シンプルです。 外部コマンドのコマンドラインを組み立てるのでない限り、パス区切りに / を使えます。\ と / が混在してもいいはずです。
Tochan

2020/02/19 14:49

hayataka2049さん、otnさん、ありがとうございます。 with open('C:/Users/Users/Desktop/' + str(download) , 'wb') as f: ftp.retrlines('RETR %s' % download, f.write) 教えて頂いた↑でようやくデスクトップにファイルが落ちてきました。 しかし、ファイル名が{'dl-item202002192344-1.csv'}となっており、CSVファイルとして扱うことができません。 集合型のままダウンロードしているからだと思うのですが、CSVファイルの形式で落としてくるのはどうしたらいいでしょうか? あと、↓のようなエラーもでました。 エラー↓ error_perm: 550 {'dl-item202002192335-1.csv'}: No such file or directory
Tochan

2020/02/20 03:49

↑は別質問を立てさせて頂きます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問