Extract lines from file, add to new files
Left Right
olegsivokon at gmail.com
Thu Jan 11 16:33:27 EST 2024
By the way, in an attempt to golf this problem, I discovered this,
which seems like a parser problem:
This is what Python tells me about its grammar:
with_stmt:
| 'with' '(' ','.with_item+ ','? ')' ':' block
| 'with' ','.with_item+ ':' [TYPE_COMMENT] block
| ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block
| ASYNC 'with' ','.with_item+ ':' [TYPE_COMMENT] block
with_item:
| expression 'as' star_target &(',' | ')' | ':')
| expression
>From which I figured why not something like this:
with (open('example.txt', 'r'), open('emails.txt', 'w'),
open('salutations.txt', 'w')) as e, m, s:
for line in e:
if line.strip():
(m if '@' in line else s).write(line)
Which, surprise, parsers! But it seems like it's parse is wrong,
because running this I get:
❯ python ./split_emails.py
Traceback (most recent call last):
File "/home/?/doodles/python/./split_emails.py", line 1, in <module>
with (open('example.txt', 'r'), open('emails.txt', 'w'),
open('salutations.txt', 'w')) as e, m, s:
TypeError: 'tuple' object does not support the context manager protocol
It seems to me it shouldn't have been parsed as a tuple. The
parenthesis should've been interpreted just as a decoration.
NB. I'm using 3.11.6.
On Thu, Jan 11, 2024 at 10:20 PM Thomas Passin via Python-list
<python-list at python.org> wrote:
>
> On 1/11/2024 1:27 PM, MRAB via Python-list wrote:
> > On 2024-01-11 18:08, Rich Shepard via Python-list wrote:
> >> It's been several years since I've needed to write a python script so I'm
> >> asking for advice to get me started with a brief script to separate names
> >> and email addresses in one file into two separate files:
> >> salutation.txt and
> >> emails.txt.
> >>
> >> An example of the input file:
> >>
> >> Calvin
> >> calvin at example.com
> >>
> >> Hobbs
> >> hobbs at some.com
> >>
> >> Nancy
> >> nancy at herown.com
> >>
> >> Sluggo
> >> sluggo at another.com
> >>
> >> Having extracted salutations and addresses I'll write a bash script using
> >> sed and mailx to associate a message file with each name and email
> >> address.
> >>
> >> I'm unsure where to start given my lack of recent experience.
> >>
> > From the look of it:
> >
> > 1. If the line is empty, ignore it.
> >
> > 2. If the line contains "@", it's an email address.
> >
> > 3. Otherwise, it's a name.
>
> You could think about a single Python script that looks through your
> input file and constructs all the message files without ever writing
> separate salutation and address files at all. Then you wouldn't need to
> write the sed and mailx scripts. It shouldn't be much harder than
> peeling out the names and addresses into separate files.
>
> If you haven't written any Python for some years, the preferred way to
> read and write files is using a "with" statement, like this:
>
> with open('email_file.txt', encoding = 'utf-8') as f:
> lines = f.readlines()
> for line in lines:
> if not line.strip(): # Skip blank lines
> continue
> # Do something with this line
>
> You don't need to close the file because when the "with" block ends the
> file will be closed for you.
>
> If the encoding is not utf-8 and you know what it will be, use that
> encoding instead.
>
> --
> https://mail.python.org/mailman/listinfo/python-list
More information about the Python-list
mailing list