<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">Hi! I think I’ve found a discrepancy in the documentation in Python’s <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">ftplib</code>.</p>
<p style="margin:0px 0px 1.2em!important">A comment on line 75 claims that <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">ftplib</code> supports <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">\r</code>, <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">\n</code>, and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">\r\n</code> line endings</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important"># Line terminators (we always output CRLF, but accept any of CRLF, CR, LF)
</code></pre><p style="margin:0px 0px 1.2em!important">but after attempting to use it to read a 2 MB file with <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">\r</code> line endings off of an FTP server, this does not appear to be the case. The entire file is read out as a single “line” (after increasing the size of FTP.maxline). It looks like this is intentional, as the the implementation of <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">FTP.retrlines()</code> and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">FTP_TLS.retrlines()</code> only strips <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">\n</code> and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">\r\n</code> (snippet from line 452)</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important">if line[-2:] == CRLF: line = line[:-2]
elif line[-1:] == '\n':
line = line[:-1]
callback(line)
</code></pre><p style="margin:0px 0px 1.2em!important">Am I missing something? Or just interpreting the documentation wrong? I know this is not a common occurrence (esp. since RFC 959 states that ASCII line endings should be <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">\r\n</code>), but it seems confusing, and doesn’t mesh with Python’s generally excellent universal newline support.</p>
<p style="margin:0px 0px 1.2em!important">This seems to be the case with the versions of <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">ftplib</code> in Ubuntu 18.04.2’s distribution of Python 2.7.15+ and Python 3.6.8. The FTP server in question is run off of an unknown RTOS on a Zumbach ODAC-14XY laser micrometer. I can provide an example of the file in question if required.</p>
<div title="MDH:PGRpdj5IaSEgSSB0aGluayBJJ3ZlIGZvdW5kIGEgZGlzY3JlcGFuY3kgaW4gdGhlIGRvY3VtZW50
YXRpb24gaW4gUHl0aG9uJ3MgYGZ0cGxpYmAuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5BIGNv
bW1lbnQgb24gbGluZSA3NSBjbGFpbXMgdGhhdCBgZnRwbGliYCBzdXBwb3J0cyBgXHJgLCBgXG5g
LCBhbmQgYFxyXG5gIGxpbmUgZW5kaW5nczwvZGl2PjxkaXY+YGBgPC9kaXY+PGRpdj4jIExpbmUg
dGVybWluYXRvcnMgKHdlIGFsd2F5cyBvdXRwdXQgQ1JMRiwgYnV0IGFjY2VwdCBhbnkgb2YgQ1JM
RiwgQ1IsIExGKTxicj48L2Rpdj48ZGl2PmBgYDwvZGl2PjxkaXY+YnV0IGFmdGVyIGF0dGVtcHRp
bmcgdG8gdXNlIGl0IHRvIHJlYWQgYSAyIE1CIGZpbGUgd2l0aCBgXHJgIGxpbmUgZW5kaW5ncyBv
ZmYgb2YgYW4gRlRQIHNlcnZlciwgdGhpcyBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgdGhlIGNhc2Uu
IFRoZSBlbnRpcmUgZmlsZSBpcyByZWFkIG91dCBhcyBhIHNpbmdsZSAibGluZSIgKGFmdGVyIGlu
Y3JlYXNpbmcgdGhlIHNpemUgb2YgRlRQLm1heGxpbmUpLiBJdCBsb29rcyBsaWtlIHRoaXMgaXMg
aW50ZW50aW9uYWwsIGFzIHRoZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgYEZUUC5yZXRybGluZXMo
KWAgYW5kIGBGVFBfVExTLnJldHJsaW5lcygpYCBvbmx5IHN0cmlwcyBgXG5gIGFuZCBgXHJcbmAg
KHNuaXBwZXQgZnJvbSBsaW5lIDQ1Mik8L2Rpdj5gYGA8ZGl2PmlmIGxpbmVbLTI6XSA9PSBDUkxG
OjxkaXY+Jm5ic3A7ICZuYnNwOyBsaW5lID0gbGluZVs6LTJdPC9kaXY+PGRpdj5lbGlmIGxpbmVb
LTE6XSA9PSAnXG4nOjxicj4mbmJzcDsgJm5ic3A7IGxpbmUgPSBsaW5lWzotMV08L2Rpdj48ZGl2
PmNhbGxiYWNrKGxpbmUpPGJyPjxkaXY+YGBgPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5BbSBJ
IG1pc3Npbmcgc29tZXRoaW5nPyBPciBqdXN0IGludGVycHJldGluZyB0aGUgZG9jdW1lbnRhdGlv
biB3cm9uZz8gSSBrbm93IHRoaXMgaXMgbm90IGEgY29tbW9uIG9jY3VycmVuY2UgKGVzcC4gc2lu
Y2UgUkZDIDk1OSBzdGF0ZXMgdGhhdCBBU0NJSSBsaW5lIGVuZGluZ3Mgc2hvdWxkIGJlIGBcclxu
YCksIGJ1dCBpdCBzZWVtcyBjb25mdXNpbmcsIGFuZCBkb2Vzbid0IG1lc2ggd2l0aCBQeXRob24n
cyBnZW5lcmFsbHkgZXhjZWxsZW50IHVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQuPC9kaXY+PGRp
dj48YnI+PC9kaXY+PGRpdj5UaGlzIHNlZW1zIHRvIGJlIHRoZSBjYXNlIHdpdGggdGhlIHZlcnNp
b25zIG9mIGBmdHBsaWJgIGluIFVidW50dSAxOC4wNC4yJ3MgZGlzdHJpYnV0aW9uIG9mIFB5dGhv
biAyLjcuMTUrIGFuZCBQeXRob24gMy42LjguIFRoZSBGVFAgc2VydmVyIGluIHF1ZXN0aW9uIGlz
IHJ1biBvZmYgb2YgYW4gdW5rbm93biBSVE9TIG9uIGEgWnVtYmFjaCBPREFDLTE0WFkgbGFzZXIg
bWljcm9tZXRlci4gSSBjYW4gcHJvdmlkZSBhbiBleGFtcGxlIG9mIHRoZSBmaWxlIGluIHF1ZXN0
aW9uIGlmIHJlcXVpcmVkLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjwvZGl2
PjwvZGl2Pg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0"></div></div><div><div>-- <br><div dir="ltr" class="m_-7761234666939209955m_7118342047367157746gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr">Cheers,<div><br></div><div>Patrick Dunham</div><div>Scale-Up Engineer</div></div></div></div></div></div></div></div>